【问题标题】:Selecting posts with multiple tags选择具有多个标签的帖子
【发布时间】:2012-09-24 17:23:44
【问题描述】:

我正在博客应用程序上实现标记系统。这个应用程序有帖子,帖子通过标签有很多标签。或多或少像 RailCast #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,该怎么办?

【问题讨论】:

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


    【解决方案1】:

    在 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 调用中。

    【讨论】:

    • 这很好用。无论如何 tag_ids.count 返回 NameError: undefined local variable or method `tag_ids' for main:Object
    • 我假设 tag_ids 是一个数组。我猜它可能是“id0,id1,id2”格式的字符串。如果是这种情况,您可以执行 tag_ids.split(",").count 来获取它需要匹配的数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多