如何查找具有many_to_many属性的所有ActiveRecord对象,该对象包含具有指定数组的所有关联对象的集合

时间:2015-01-28 10:26:10

标签: ruby-on-rails ruby activerecord

我有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

上面的陈述给了我全部三个:(

1 个答案:

答案 0 :(得分:1)

您应该使用group,如下所示:

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

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