🧩

Active RecordでのOR条件の書き方

2024/04/03に公開

こんにちは!
ラブグラフでエンジニアをしているけいすけと申します。
業務の中でOR条件のクエリを書く機会があったので書き方をまとめておきます。

例として、マッチングアプリのようなサービスを扱っていて、
その中から特定の条件を満たすユーザーを取得する場合を考えてみます。

このサービスにはユーザーの情報を持つ users テーブルがあり、
nameaddressoccupationhobbyはそれぞれユーザーの名前、住所、職業、趣味を表すとします。

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. pluckArray#| を使う方法

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