假设我有两个Product
关联的模型Payment
和has_many
。
class Product < ApplicationRecord
has_many :payments
end
class Payment < ApplicationRecord
belongs_to :product
end
Payment
模型具有属性paid
,可以是true
或false
。如何找到仅具有products
属性设置为payments
的{{1}}的所有paid
?
我尝试过:
false
但是它返回Product.joins(:payments).where(payments: { paid: false }).distinct
时,当我需要所有它们全部为products
时,其中至少一个payment
是false
。
答案 0 :(得分:1)
我是Ransack的忠实拥护者,它通过ActiveRecord
简化了很多查询
您正在寻找只有假付款的产品,因此您可以在ransack查询中添加两个子句以达到所需的结果。
首先安装ransack,然后使用它来查看是否获得所需的结果
Product.ransack(
payments_paid_eq: false,
payments_paid_not_eq: true)
.result
.distinct
在某些方面,这是一个有点令人困惑的查询,但从本质上讲,您是说退还所有付款为假的产品,而不退还付款为真的产品。
以下不使用ransack gem的替代方法是
Product.joins(:payments)
.where(payments: {paid: false})
.where.not(payments: {paid: true})
.distinct
答案 1 :(得分:0)
我认为这可能可以满足您的需求:
Product.
where(id: Payment.where(paid: false).pluck(:product_id)).
where.not(id: Payment.where(paid: true).pluck(:product_id))