Rails,拥有并属于许多人,符合所有条件

时间:2017-09-26 11:17:36

标签: ruby-on-rails ruby activerecord has-and-belongs-to-many

我有两个模型文章和类别

class Article < ApplicationRecord

  has_and_belongs_to_many :categories

end

我想获得与类别1和类别2相关联的文章。

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

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

2 个答案:

答案 0 :(得分:1)

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

它会是这样的:

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)

但它会提出额外的请求,并且需要额外关注无法找到类别的情况。

答案 1 :(得分:0)

这样做的方法是多次加入同一个表。以下是文章中未经测试的类方法:

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