У меня есть модель Member, у которой много DuesPayments.
Мне нужен запрос для участников, которые не внесли свои взносы в 2012 году. Поле в разделе «Оплата взносов»: for_year. Или по-английски — мне нужны все участники, у которых нет записи в таблице dues_payments с 2012 годом.
#<DuesPayment:0x00000107b3cdd0> {
:id => 1209,
:member_id => 446,
:amount => 25.0,
:created_at => Thu, 07 Feb 2013 17:01:15 EST -05:00,
:updated_at => Thu, 07 Feb 2013 17:01:15 EST -05:00,
:for_year => 2013,
:payment_notification_id => 300
}
Кажется, мне нужно внешнее соединение? Проблема в том, что там нет записи, чтобы «выбрать», если платеж не был произведен.
Это то, что я делаю сейчас, это в основном подзапрос и инверсия. Идея здесь состоит в том, чтобы получить идентификаторы всех участников, которые заплатили свои взносы, а затем выбрать всех участников, которые не являются ТЕМИ членами:
scope :dues_not_paid_in, lambda {|year|
Member.
where("id not in (?)",
DuesPayment.
select(:member_id).
where(:for_year => year).
collect(&:member_id).uniq
)
}
Я предполагаю, что есть более элегантный способ сделать это.