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 })
工作于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 })