我有两个模型文章和类别
class Article < ApplicationRecord
has_and_belongs_to_many :categories
end
我想获得与类别1和类别2相关联的文章。
Article.joins(:categories).where(categories: {id: [1,2]} )
上面的代码不会这样做,因为如果一个类别为1或类别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