学習バンザイITエンジニアの精神安穏日記

ITエンジニアというより、IT系雑務者

ActiveRecordで複数のAND条件をORしたいときの方法

こういうSQLを得たい。

 select 
  * 
from posts 
where 
  user_id = ? AND posted_at > ? 
  OR user_id = ? AND posted_at > ?

とりあえずやってみた。

Postクラスがあるとする。 以下のカラムをもつ。

  • user_id
  • posted_at
class Post < ActiverecordBase
  # user_id
  # posted_at
end
# Array<posted_at, user_id>
condition_pairs = [[today, 1], [tomorrow,  2]]

conditions = Array.new(condition_pairs.size) { 
  "user_id = ? AND posted_at > ?" 
}.join(" OR ")

contidisonsの結果

# => "user_id = ? AND posted_at > ? OR user_id = ? AND posted_at > ?"

sqlを作る。

Post.where(conditions, condition_pairs.flatten)

結果

 select 
  * 
from posts 
where 
  user_id = ? AND posted_at > ? 
  OR user_id = ? AND posted_at > ?

蛇足

括弧いるんじゃないか。