2

我正在博客应用程序上实现标记系统。这个应用程序有帖子,帖子通过标签有很多标签。或多或少像 RailCasts #382 http://railscasts.com/episodes/382-tagging

我将使用复选框来选择具有多个标签的帖子,如下所示:

Post.joins(:tags).where(:tags => { :id => [tag_ids] } )

但是,如果我想加入具有所有必需标签的帖子而不是只满足一个要求的帖子怎么办?

例如:

Post1 有标签“foo、bar、baz”

Post2 有标签 "bar, baz"

Post3 有标签“酒吧”

如果我搜索 ["bar", "baz"],我的方法会返回帖子 1、2 和 3。如果我只想返回帖子 1 和 2,该怎么办?

4

1 回答 1

3

在 SQL 中,你会做类似的事情

GROUP BY posts.id
HAVING count(tags.name) = 2

在 Rails 中,它转换为

Post.joins(:tags).select('posts.id').where(:tags => { :id => [tag_ids] }
).having("count(tags.name) = ?", tag_ids.count).group('posts.id')

上面的代码假定这tag_ids是一个 id 数组。此外,它只加载返回的 ActiveRecord Post 对象集的 id。

如果要加载更多字段,请将它们添加到select调用中,或者删除select调用以加载所有 Post 字段。请记住,对于在结果 SQL 查询中检索到的 Post 中的每个列/字段,您需要将该字段添加到group调用中。

于 2012-09-25T01:22:20.653 回答