Rails 4查询嵌套has_many为空的查询记录

时间:2017-01-23 17:43:57

标签: sql ruby-on-rails ruby activerecord has-many

使用Rails 4。

CompensationRecipient --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

确实,该列不存在。我不明白为什么这个查询会预期它。

1 个答案:

答案 0 :(得分:1)

在这种情况下,您需要左外连接。在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 })