2013-02-16 3 views
0

У меня есть модель, у которой есть много DuesPayments.Как написать запрос в Active record для модели с whos has_many пуст?

Я хочу получить запрос для членов, которые не ввели их dues_payment в 2012 году. Поле в DuesPayment: 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 
) 
} 

Я думаю, что есть более элегантный способ сделать это.

ответ

0

Не понимая немного больше о своих моделях, что-то вроде этого должно работать, если вам нужна дополнительная помощь, вы можете опубликовать код модели и узнать, есть ли платеж или нет.

unpaid_members = Member.DuesPayments.where(for_year: 2012) 
1

У вас есть какая-то платная/неоплаченная колонка на вашей модели dues_payments? Если так что вы можете сделать:

Member.joins(:dues_payments).where("for_year = ? AND paid = ?", 2012, false) 
+0

нет, если они не платят, нет никаких записей вообще в этом году. – pixelearth

0

члены, которые не делают их dues_payment в 2012 году

Member.where("id NOT IN (?)", DuesPayment.select(:member_id).where(:for_year => 2012).map(&:member_id)) 
+0

Это не сработает. – pixelearth

+0

обновил ответ – shweta

+0

это то, что у меня уже есть – pixelearth