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 で、複雑な場合だけメソッドにすればいい。