🧩
Active RecordでのOR条件の書き方
こんにちは!
ラブグラフでエンジニアをしているけいすけと申します。
業務の中でOR条件のクエリを書く機会があったので書き方をまとめておきます。
例として、マッチングアプリのようなサービスを扱っていて、
その中から特定の条件を満たすユーザーを取得する場合を考えてみます。
このサービスにはユーザーの情報を持つ users
テーブルがあり、
name
、address
、occupation
、hobby
はそれぞれユーザーの名前、住所、職業、趣味を表すとします。
users
テーブル
name | address | occupation | hobby |
---|---|---|---|
一郎 | tokyo | engineer | workout |
二郎 | tokyo | engineer | cooking |
三郎 | tokyo | designer | workout |
四郎 | tokyo | designer | cooking |
五郎 | osaka | engineer | workout |
六郎 | osaka | engineer | cooking |
七郎 | osaka | designer | workout |
八郎 | osaka | designer | cooking |
今回はこの users
テーブルから
「職業がエンジニア」または「趣味が筋トレ」のユーザー
を取得するクエリを書いてみます。
つまり期待する取得結果は次のようになります。
name | address | occupation | hobby |
---|---|---|---|
一郎 | tokyo | engineer | workout |
二郎 | tokyo | engineer | cooking |
三郎 | tokyo | designer | workout |
五郎 | osaka | engineer | workout |
六郎 | osaka | engineer | cooking |
七郎 | osaka | designer | workout |
Active RecordでのOR条件の書き方
3種類の書き方を紹介します。
or
メソッドを使う方法
1. 1つ目はActive Recordの or
メソッドを使う方法です。次のように書くことでOR条件のクエリになります。
User
.where(occupation: "engineer")
.or(User.where(hobby: "workout"))
pluck
と Array#|
を使う方法
2. pluck
と集合の和演算の演算子の Array#|
を使うという方法もあります。
次の例では、「職業がエンジニア」のユーザーのIDと「趣味が筋トレ」のユーザーのIDを別々に取得してから、それらの和集合を求めて find
メソッドに渡しています。
engineer_ids = User.where(occupation: "engineer").pluck(:id)
workout_ids = User.where(hobby: "workout").pluck(:id)
engineer_or_hobby_ids = engineer_ids | workout_ids
User.find(engineer_or_hobby_ids)
3. SQLを書く方法
Ruby on Railsらしさはなくなってしまいますが、SQLを直接書くという方法もあります。
Employee.where("address = :address OR occupation = :occupation", { address: "tokyo", occupation: "engineer"})
最後に
以上、Active RecordでのOR条件の書き方を3つ紹介しました。
最後まで読んでいただきありがとうございました!
Discussion