タグフィードと友達フィードがあります。これら2つを組み合わせて、究極の「すべて」のフィードを作成したいと思います。
フレンドフィードの場合:
class Post < ActiveRecord::Base
scope :friendfeed, lambda{|x| followed_by}
def self.followed_by(user)
where("user_id IN (?) OR user_id = ?", user.watched_ids, user.id)
end
end
タグフィードの場合:
class Post < ActiveRecord::Base
scope :tagfeed, lambda{|x| infatuated_with}
def self.infatuated_with(user)
joins(:attachments).where("attachments.tag_id IN (?)", user.tags).select("DISTINCT pages.*")
end
end
そして、私はコントローラーからこのようなものを呼び出します(私はページ付けにカミナリジェムを使用しています):
@tag_feed = Post.tagfeed(current_user).page(params[:page]).per(21)
@friend_feed = Post.friendfeed(current_user).page(params[:page]).per(21)
今はユニバーサルフィードが欲しいのですが、迷ってしまいました。スコープは絞り込むためのものですが、この場合はOR操作を実行しようとしています。次のような操作を実行します。
@mother_of_all_feed = @tag_feed + @friend_feed
冗長になり、1ページに表示される投稿の数を制御できなくなります。どうすればこれを行うことができますか?ありがとう!
ちなみに、タグの場合、次のように関連付けを設定します。
class Post < ActiveRecord::Base
has_many :attachments
has_many :tags, :through => :attachments
end
class Tag < ActiveRecord::Base
has_many :attachments
has_many :posts, :through => :attachments
end
class Attachment < ActiveRecord::Base
belongs_to :tag
belongs_to :post
end
私自身の質問に答えます。私は方法を考え出したと思います。
where("pages.id IN (?) OR pages.id IN (?)",
Page.where(
"user_id IN (?) OR user_id = ?",
user.watched_ids, user.id
),
Page
.joins(:attachments)
.where("attachments.tag_id IN (?)", user.tags)
.select("DISTINCT pages.*")
)
これまでのところ機能しているようです。これでうまくいくことを願っています。
Railsこの機能のプルリクエスト( https://github.com/Rails/rails/pull/9052 ))がありますが、その間に、誰かがイニシャライザーに含めることができるモンキーパッチを作成しました。これにより、1つのクエリでスコープとwhere句を使用できるようになり、ActiveRecord::Relation
:
https://Gist.github.com/j-mcnally/250eaaceef234dd8971b
これで、次のようにスコープをOR
Post.tagfeed(current_user).or.friendfeed(current_user)
または新しいスコープを作成します
scope :mother_of_all_feed, lambda{|user| tagfeed(user).or.friendfeed(user)}
これは、2つのスコープを組み合わせる方法の例です。
scope :reconcilable, -> do
scopes = [
with_matching_insurance_payment_total,
with_zero_insurance_payments_and_zero_amount
]
where('id in (?)', scopes.flatten.map(&:id))
end