🧩
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種類の書き方を紹介します。
1. or メソッドを使う方法
1つ目はActive Recordの or メソッドを使う方法です。次のように書くことでOR条件のクエリになります。
User
.where(occupation: "engineer")
.or(User.where(hobby: "workout"))
2. pluck と Array#| を使う方法
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