如何在Active记录中为has_many为空的模型编写查询?

时间:2013-02-16 03:16:43

标签: ruby-on-rails join rails-activerecord arel

我有模型会员,有很多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
  )
}

我的猜测是有一种更优雅的方式来做到这一点。

3 个答案:

答案 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))