我有标记Feed和朋友Feed。 我想结合这两个并构建最终的“全部”提要。
对于朋友提要:
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
对于代码Feed:
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
我会从控制器中调用这样的东西(我使用Kaminari宝石进行分页):
@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
将是多余的,我无法控制出现在单个页面上的帖子数量。我该怎么做呢?谢谢!
顺便说一下,对于标签我有这样的关联设置:
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
答案 0 :(得分:17)
此功能有一个rails pull请求(https://github.com/rails/rails/pull/9052),但与此同时,有人创建了一个猴子补丁,您可以将其包含在初始化程序中,这将允许您或范围和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)}
答案 1 :(得分: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.*")
)
到目前为止似乎工作正常,希望就是这样!
答案 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