我有Post
和Tag
模型通过Tagging
模型加入has_many :through
我从表单中传递params[:tag_ids]
,并且我试图获取所有标记为所有标记的帖子(不仅仅是其中任何一个标记)
我正在尝试以下方法:
@ftags = params[:tags_ids]
@objArray = Array.new
@ftags.each do |tag|
@array = Tagging.where("tag_id=#{tag}")
@objArray.push @array
end
...现在我想做的是以某种方式组合这些查询以获得正确的帖子。之前,当我只有两个查询时,我曾经和merge命令结合使用,如下所示:
@result = @query1.merge(@query2)
...但是现在我有一些动态的查询,我仍然希望最终将它们组合在一起。如何在特定列的特定值的循环内进行合并?
答案 0 :(得分:5)
您有一个标记ID列表,并希望查找包含所有这些标记的所有帖子:
# contains [1, 2, 3]
tag_ids = params[:tag_ids]
Post.joins(:taggings)
.where(taggings: { tag: tag_ids })
.group('posts.id')
.having("count(taggings.id) = #{tag_ids.length}")
答案 1 :(得分:1)
您可以撤回单独的post_id
个集合,然后使用列表的交集来获取所有列表中的帖子(即包含所有标记的帖子)。
post_ids = []
params[:tags_ids].each do |tag_id|
post_ids << Tagging.select(:post_id).where(tag_id: tag_id)
end
Post.where id: post_ids.reduce &:&
...但@ janfoeh的答案更好。
[编辑以纠正关于无法在单个SQL查询中执行此操作的错误评论]