我有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
上面的陈述给了我全部三个:(
答案 0 :(得分:1)
您应该使用group
,如下所示:
Article.joins(:tags).where(tags: {name: %w(foo bar)}).group('articles.id').having('count(*) = ?', 2)
如果您使用join
,并且如果有多个tags
的名称foo
或bar
附加到特定文章,则本文中将有两行结果。因此,您只需按article id
(或任何其他唯一键,但主键最方便)对结果进行分组,并仅返回计数等于2
的那些(即使用两个标记)附)。