2011-06-22 15 views
0

申し訳ありませんが、データベースのものは私の傷跡になっています。ユーザー、請求書、支払3つのレベルのモデル間でアクティブなレコード検索を作成するには?

ユーザーhas_manyの請求書と請求書の支払いにhas_many:

は、私は全体で検索しようとしている3つのモデルを持っています。

私は、特定の日付範囲でcurrent_userのすべての支払いを見つける検索を作成しようとしています。

これは私がこれまで行っているか

invoices = current_user.invoices 
payments = invoices.inject([]) {|arr,x| arr += x.payments.where("payment_date <= ? and payment_date >= ?", '2011-02-01', '2011-01-01')} 

ですこれは私には非常識と思われます。結果を反復することなく直接データベースからこれを取得する方法が必要であると確信しています。何か案は?あらかじめ乾杯!

答えて

4

次のようなものを使用する必要がありますリンクガイドから

、よりクリーンな構文:あなたはおそらく UPDATE

active record query程度のRubyでRailsのガイドを読みたい

Payments.joins(:invoice => :user).where("users.id = ? AND (payments.payment_date <= ? and payments.payment_date >= ?)", current_user.id, '2011-02-01', '2011-01-01') 

time_range = (Time.now.midnight - 1.month)..Time.now.midnight 
Payments.joins(:invoice => :user).where(:users => {:id => current_user.id}, :payments => {:payment_date => time_range}) 

UPDATE 2、別の解決策:モデルUser

has_many :payments, :through => :invoices 

クエリを実行するには:

time_range = (Time.now.midnight - 1.month)..Time.now.midnight 
current_user.payments.where(:payment_date => time_range) 
+0

ニース、私はあなたの最終的なソリューションを使用していました。私は実際に結合を理解していないので、もう少し読む必要があります(最終的な解決策がフードの中で何をしているのかは分かりますが)。ありがとう。 – brad

+0

[Active Record Associations](http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html)についてもお読みになることをお勧めします。 –

関連する問題