2017-01-23 16 views
0

Работа в Rails 4.Rails 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 

I хочу, чтобы все получатели компенсации, у которых есть компенсации, не платят за них. Похоже, это не должно быть очень сложно, но я не нашел решения.

что-то вроде этого:

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

Это не работает, однако: PG::UndefinedColumn: ERROR: column compensations.compensation_id does not exist

Это правда, что колонка не существует. Я не понимаю, почему этот запрос ожидает этого.

ответ

1

В этом случае вам необходимо левое внешнее соединение. Для рельсов 4 нет специального метода (в рельсах 5 у нас есть left_joins), но вы можете передать кусок sql в методе joins.

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