【问题标题】:How to find all ActiveRecord objects which have for a many_to_many attribute a collection that contains all associated objects with specified array如何查找具有 many_to_many 属性的所有 ActiveRecord 对象的集合,该集合包含具有指定数组的所有关联对象
【发布时间】:2015-03-27 05:01:40
【问题描述】:

我有 2 个与 has_and_belongs_to_many 关系关联的 ActiveRecord 对象:文章和标签。

我想选择所有带有名称 foo 和 bar 的标签的文章。

我正在尝试执行以下语句,但没有运气。任何帮助表示赞赏。

# gives me non-inclusive associated articles.
Article.joins(:tags).where(tags: {name: ['foo','bar']}) 

编辑:伪代码进一步解释:

article_one.tags = ['foo', 'bar']  # want this one only

article_two.tags = ['foo', 'baz']  # no good

article_three.tags = ['bar', 'baz']  # no good

上面的陈述给了我所有三个:(

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    你应该使用group,像这样:

    Article.joins(:tags).where(tags: {name: %w(foo bar)}).group('articles.id').having('count(*) = ?', 2)
    

    如果您使用join 并且有多个tags 名称为foobar 附加到特定文章,则结果中将有两行与这篇文章。因此,您只需按 article id(或任何其他唯一键,但主键在这里最方便)对结果进行分组,并仅返回计数等于 2 的结果(即附加了两个标签)。

    【讨论】:

    • 是的,我要早点睡觉了...谢谢你修复我的格式!!
    • 这不会给我所有只包含 foo 或 bar 的文章吗?我想返回包含两者的结果
    • @believesInSanta 对,我误解了你的问题。我更新了我的答案,希望对您有所帮助。
    • 您愿意解释一下您在使用组和方法方面所做的事情吗?谢谢。
    • @believesInSanta 我添加了一些解释。如果仍有不清楚的地方,请询问。
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多