查找标有ALL标签的帖子

时间:2015-02-19 15:15:17

标签: ruby-on-rails ruby-on-rails-4 activerecord

我有PostTag模型通过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)

...但是现在我有一些动态的查询,我仍然希望最终将它们组合在一起。如何在特定列的特定值的循环内进行合并?

2 个答案:

答案 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查询中执行此操作的错误评论]