我有很多 DuesPayments 的模型会员。
我想查询 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
}
好像我需要一个外部连接?问题是如果没有付款,那里没有记录可以“选择”。
这就是我现在正在做的,它基本上是一个子查询和一个反转。这里的想法是获取所有支付了会费的成员的 ID,然后选择所有不是 THOSE 成员的成员:
scope :dues_not_paid_in, lambda {|year|
Member.
where("id not in (?)",
DuesPayment.
select(:member_id).
where(:for_year => year).
collect(&:member_id).uniq
)
}
我的猜测是有一种更优雅的方式来做到这一点。