読者です 読者をやめる 読者になる 読者になる

Rails3 の ActiveRecord で WHERE 部分に OR を含んだクエリを発行する方法

Rails3 の ActiveRecord で、WHERE 部分に OR を使ったクエリを発行するには、ActiveRecord::Base#arel_table を使って、条件を組み立てればいい。

# フォローしているユーザーのアクティビティを取得する
def user_stream(user)
  friendships = Friendship.where(:user_id => user.id)

  filters = nil
  friendships.each do |f|
    filter = Activity.arel_table[:user_id].eq(f.target.id)

    if filters.nil?
      filters = filter
    else
      filters = filters.or(filter)
    end
  end

  Activity.where(filters).order("created_at DESC")
end

Friendship と Activity の2つのモデルを使ってるからメソッドで実装したけど、1つのモデルしか使わない場合は scope で十分。というか、基本 scope で、複雑な場合だけメソッドにすればいい。