我正在博客应用上实施标记系统。这个应用程序有帖子,帖子通过标签有很多标签。或多或少像RailCasts#382 http://railscasts.com/episodes/382-tagging
我将使用复选框选择包含多个标签的帖子,如下所示:
Post.joins(:tags).where(:tags => { :id => [tag_ids] } )
但是,如果我想加入包含所有必需标签的帖子而不是仅满足一个要求的帖子,该怎么办?
exapmle:
Post1有标签“foo,bar,baz”
Post2有标签“bar,baz”
Post3有标签“bar”
如果我搜索[“bar”,“baz”]我的方法会返回帖子1,2和3.如果我只想返回第1和第2个帖子?
答案 0 :(得分: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
调用以加载所有帖子字段。请记住,对于在结果SQL查询中检索的Post中的每个列/字段,您需要将该字段添加到group
调用。