【メモ】Railsで特定かつ複数のレコードを除外する
あんまり大した内容でもないんですが、ちょっと詰まったので備忘録として。
はじめに
とあるRailsアプリケーションでユーザーのアクセス記録をCSVに出力するために、データを整形する必要がありました。
データの構造としてはUserとAccessというモデルがあり、それぞれ一対多の関係で紐づいています。
Accessモデルは、ユーザーがアクセスしたその日の最終ログイン日時を記録するだけの機能を持ちます。一日につき一個のレコードが作成されるということですね。
で、このAccessのデータを纏めて出力したいんですが、実はUserの中には管理者用のアカウントとかテストアカウントも含まれているので、それらのアクセス日時は出力されないようにする必要がありました。
本来であればこういうのはユーザーにロールや権限を設定するカラムを作って管理するべきなんでしょうが、そこは諸々の都合により。
幸いにもユーザーの名前は一意なものであったので、これを使って識別することは出来そうです。
実装
結論から言うと、以下のようなコードになりました。
accesses = Access.joins(:user)
.where.not('users.name = ? OR users.name = ?', 'Admin', 'Test')
AccessテーブルとUserテーブルを内部結合させ、where.not句で条件に当て嵌まるレコードを除外するのですが、その条件指定をプレースホルダーで記述するという感じですね。
これでAdminユーザーとTestユーザーに紐づくAccessレコードを除いた全てのAccessレコードを取得できるので、あとは期間指定とか並び順とかメソッドを繋げてやって整形すれば良いかと。
実際のコードではCSVに出力するにあたって、この後もうちょっとゴニョゴニョ整形してます。
何かもう少しスマートに書けそうな気もするんですが、とりあえずはこれで良しとする感じで。