2017-01-23 62 views
0

Rails中4軌道4查詢記錄,其中嵌套的has_many是空

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 

我希望得到所有補償收款人沒有付款的補償。它似乎不應該是非常difficult,但我還沒有找到解決方案。

是這樣的:

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

這不但是工作:PG::UndefinedColumn: ERROR: column compensations.compensation_id does not exist

這是真的,那列不存在。我不明白爲什麼這個查詢期望它。

回答

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 })