Rails 4条查询记录 nested has_many 为空

Rails 4 query records where nested has_many is empty

工作于Rails 4.

补偿收件人--has_many--> 补偿--has_many--> 付款

所以:

class CompensationRecipient
  has_many :compensations
end

class Compensation
  has_many :payments
  belongs_to :compensation_recipient
end

class Payment
  belongs_to :compensation
end

我想得到所有没有支付赔偿金的赔偿金领取者。看起来应该不是很困难,但是我没有找到解决方法。

像这样:

CompensationRecipient.includes(compensations: :payments).where(compensations: { payments: { id: nil }} )

但这不起作用:PG::UndefinedColumn: ERROR: column compensations.compensation_id does not exist

是的,该列不存在。我不明白为什么这个查询需要它。

在这种情况下你需要左外连接。在 rails 4 中没有特殊的方法(在 rails 5 中我们有 left_joins),但是你可以在 joins 方法中传递 sql 的块。

CompensationRecipient
  .joins("LEFT JOIN compensations ON compensations.compensation_recipient_id = compensation_recipient.id")
  .joins("LEFT JOIN payments ON payments.compensation_id = compensations.id")
  .where(payments: { id: nil })

UPD:虽然第一次加入应该是内部的,因为您根本不希望收件人没有补偿,对吗?

CompensationRecipient
  .joins(:compensations)
  .joins("LEFT JOIN payments ON payments.compensation_id = compensations.id")
  .where(payments: { id: nil })