尝试选择所有至少有一个关联对象与查询不匹配的对象

时间:2019-05-24 16:36:54

标签: ruby-on-rails join activerecord

我有两个关联的模型。 Product有许多DescriptorFiles,而DescriptorFile具有布尔属性approved

我想查找所有未批准任何关联描述符文件的产品。

这就是说:我想找到所有描述符文件均为approved: false的所有产品。

我只是想出了一个解决方案,但我希望通过活动记录查询来完成所有工作:

Product.all - Product.joins(:descriptor_files).where(descriptor_files: {approved: true})

这有效,但是如上所述,如果我可以返回活动记录对象,那就太好了。

谢谢!

3 个答案:

答案 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})