我有模型会员,有很多DuesPayments。
我想要查询2012年没有支付dues_payment的会员.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 :(得分:1)
您的dues_payments模型中是否有某种付费/未付费列?如果是这样,你可以这样做:
Member.joins(:dues_payments).where("for_year = ? AND paid = ?", 2012, false)
答案 1 :(得分:0)
如果不了解您的模型,这样的事情应该有效,如果您需要更多帮助,可以发布模型代码以及我们如何知道付款是否到期。
unpaid_members = Member.DuesPayments.where(for_year: 2012)
答案 2 :(得分:0)
2012年没有缴纳会费的会员
Member.where("id NOT IN (?)", DuesPayment.select(:member_id).where(:for_year => 2012).map(&:member_id))