Rails, 拥有且属于多个,匹配所有条件

Rails, Has and belongs to many, match all conditions

我有两个模型 Article 和 Category

class Article < ApplicationRecord

  has_and_belongs_to_many :categories

end

我想获取关联类别 1 和类别 2 的文章。

Article.joins(:categories).where(categories: {id: [1,2]}  )

上面的代码不会这样做,因为如果关联了类别 1 或类别 2 的文章,那么它将被返回,而这不是目标。两者必须匹配。

只能查询第一类的文章,也是第二类的文章。

会变成这样:

Article.joins(:categories)
  .where(categories: { id: 1 })
  .where(id: Article.joins(:categories).where(categories: { id: 2 }))

注意,它可以是:

Category.find(1).articles.where(id: Category.find(2).articles)

但它提出了额外的要求,需要额外注意找不到类别的情况。

方法是多次加入相同的 table。这是文章中未经测试的 class 方法:

def self.must_have_categories(category_ids)
  scope = self

  category_ids.each do |category_id|
    scope = scope.joins("INNER JOIN articles_categories as ac#{category_id} ON articles.id = ac#{category_id}.article_id").
        where("ac#{category_id}.category_id = ?", category_id)
  end

  scope
end