26

タグフィードと友達フィードがあります。これら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
4

3 に答える 3

17

この機能のRailsプルリクエスト(https://github.com/rails/rails/pull/9052)がありますが、その間に、誰かがモンキーパッチを作成しました。これを初期化子に含めると、次のことが可能になります。またはスコープとwhere句を1つのクエリに含めても、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)}
于 2013-05-15T18:40:22.503 に答える
4

私自身の質問に答えます。私は方法を考え出したと思います。

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.*")
)

これまでのところ機能しているようです。これでうまくいくことを願っています。

于 2012-05-24T10:14:01.623 に答える
2

これは、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
于 2020-02-15T00:12:50.290 に答える