2012-09-24 39 views
2

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

我将使用复选框选择多个标签这样的帖子:

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

但是如果我想加入的是拥有所有必需的标签,而不是职位职位,只满足一个要求?

对于exapmle:

POST1有标签的 “富,酒吧,巴兹”

POST2具有标签 “栏,巴兹”

Post3具有标签 “栏”

如果我搜索对于[“bar”,“baz”]我的方法返回帖子1,2和3.如果我只想返回帖子1和2?

回答

2

在SQL中,你会做这样的事情

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

在轨将其转换为

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

上面的代码假定tag_ids是IDS的数组。另外,它只加载返回的ActiveRecord Post对象集合的id。

如果您想要加载更多字段,请将其添加到select调用中,或以其他方式删除select调用以加载所有Post字段。请记住,对于在生成的SQL查询中检索到的来自Post的每个列/字段,您需要将该字段添加到group调用中。

+0

这工作正常。无论如何,tag_ids.count返回NameError:未定义的局部变量或方法'tag_ids'为主:对象 – TopperH

+0

我认为tag_ids是一个数组。我猜它可能是“id0,id1,id2”格式的字符串。如果是这样的话,你可以做tag_ids.split(“,”)。count来获得它需要匹配的数字。 – zeikt