查找所有关联记录仅具有特定属性值的记录

时间:2018-08-15 06:49:48

标签: ruby-on-rails activerecord

假设我有两个Product关联的模型Paymenthas_many

class Product < ApplicationRecord
  has_many :payments
end
class Payment < ApplicationRecord
  belongs_to :product
end

Payment模型具有属性paid,可以是truefalse。如何找到仅具有products属性设置为payments的{​​{1}}的所有paid

我尝试过:

false

但是它返回Product.joins(:payments).where(payments: { paid: false }).distinct 时,当我需要所有它们全部为products时,其中至少一个paymentfalse

2 个答案:

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