2017-01-23 2 views
0

in Rails Arbeiten 4.Rails 4 Abfrage Datensätze, in denen verschachtelte has_many leer

CompensationRecipient --has_many -> Kompensationen --has_many -> Zahlungs

So:

class CompensationRecipient 
    has_many :compensations 
end 

class Compensation 
    has_many :payments 
    belongs_to :compensation_recipient 
end 

class Payment 
    belongs_to :compensation 
end 

I Ich möchte alle Entschädigungsempfänger erhalten, deren Entschädigungen keine Zahlungen an sie haben. Es scheint, als ob es nicht sehr schwierig sein sollte, aber ich habe die Lösung nicht gefunden.

etwas wie folgt aus:

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

Das ist nicht jedoch arbeiten: PG::UndefinedColumn: ERROR: column compensations.compensation_id does not exist

Es ist wahr, dass Spalte nicht existiert. Ich verstehe nicht, warum diese Abfrage es erwartet.

Antwort

1

In diesem Fall benötigen Sie die linke äußere Verbindung. Es gibt keine spezielle Methode dafür in Schienen 4 (in Schienen 5 haben wir left_joins), aber Sie könnten Stück von SQL in joins Methode übergeben.

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: Der erste Join sollte aber innerlich sein, weil Sie Empfänger ohne Kompensationen überhaupt nicht wollen, oder?

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