我有两个关联的模型。 Product
有许多DescriptorFiles
,而DescriptorFile
具有布尔属性approved
。
我想查找所有未批准任何关联描述符文件的产品。
这就是说:我想找到所有描述符文件均为approved: false
的所有产品。
我只是想出了一个解决方案,但我希望通过活动记录查询来完成所有工作:
Product.all - Product.joins(:descriptor_files).where(descriptor_files: {approved: true})
这有效,但是如上所述,如果我可以返回活动记录对象,那就太好了。
谢谢!
答案 0 :(得分:1)
在Rails 5+中,您可以使用AreEqual()
,因此在这种情况下,您的查询将是
where.not
这将使用原始版本的子查询作为Product.where.not(id:
Product.select(:id).joins(:descriptor_files)
.where(descriptor_files: {approved: true})
)
子句。
产生的SQL
NOT IN
答案 1 :(得分:1)
您可以保留已批准的LEJO JOIN描述符文件,并确保仅检索未加入任何内容的记录。 (这也将查询完全没有描述符文件的产品。)
Product.joins('LEFT OUTER JOIN descriptor_files ON descriptor_files.product_id = product.id AND descriptor_files.approved = true')
.where(descriptor_files: { id: nil })
不幸的是,尽管您可以使用Arel生成Join子句,但必须手动编写联接。
答案 2 :(得分:0)
或者,您可以将left_outer_joins
用于滑轨5 +
results = Product.left_outer_joins(:descriptor_files)
.where(descriptor_files: {approved: false})