0

多くの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
}

外部結合が必要なようですか?問題は、支払いが行われていない場合に「選択」する記録がないことです。

これは私が現在行っていることで、基本的にはサブクエリと反転です。ここでの考え方は、会費を支払ったすべてのメンバーの ID を取得し、それらのメンバーではないすべてのメンバーを選択することです。

scope :dues_not_paid_in, lambda {|year|
  Member.
    where("id not in (?)", 
      DuesPayment.
        select(:member_id).
        where(:for_year => year).
        collect(&:member_id).uniq
  )
}

私の推測では、これを行うためのよりエレガントな方法があります。

4

3 に答える 3

1

dues_payments モデルに有料/未払いの列がありますか? もしそうなら、あなたはすることができます:

Member.joins(:dues_payments).where("for_year = ? AND paid = ?", 2012, false)
于 2013-02-16T04:00:31.007 に答える
0

モデルについてもう少し理解していなくても、このようなことが機能するはずです。さらにサポートが必要な場合は、モデルコードを投稿して、支払い期限があるかどうかを確認する方法を教えてください。

unpaid_members = Member.DuesPayments.where(for_year: 2012)
于 2013-02-16T03:54:36.840 に答える
0

2012年会費未納者

Member.where("id NOT IN (?)", DuesPayment.select(:member_id).where(:for_year => 2012).map(&:member_id))
于 2013-02-16T04:51:34.770 に答える