2011-12-16 8 views
2

から3.1実践:ベストRailsのを考えると複雑なクエリ

(モデル):例えば

Contract (has_many :invoices, belongs_to :user) 
Invoice (belongs_to :contract) 

この方法で、この場合には

my_contracts = Contract.where(user_id: current_user.id) #=> [#<Contract id: 1, title: "1">, #<Contract id: 2, title: "2">] 

は、我々はユーザーのための2件の契約を持っています。また、各契約には複数の請求書があります。

ここで、契約ごとにすべての請求書を集め、 'updated_at'でソートする必要があります。

all_invoices = my_contracts.map{|i| i.invoices.sort_by(&:updated_at)} 

が、ActiveRecordのを使用して: 何かのように。

どのように正しく行うことができましたか?

それは

Invoice.joins(:contracts).where(user_id: current_user.id).order(:updated_at) 

ARELは鉱山(まだそれで作業する必要がある)の強いスーツではありませんが、これが動作しない場合、それは少なくともにあなたが近づく必要があるようなものでなければなりません

答えて

0

答え。

+0

わからない参照が、 'は契約と請求書テーブルの両方にあるので、updated_atにあいまいなエラーが出る可能性がありますか? '.order(" invoices.updated_at ")'が必要かもしれません。 – house9

+0

それは本当です。これらは、 'Invoice.joins(:contracts).where(user_id:current_user.id).order(:updated_at).to_sql'を使ってレールコンソールで試してみて、生成されたSQLを見るのがベストです。 (そして、自然にテストケースにすべてをチェックさせるべきです;-)) –

1

あなたはそれをやっている方法が悪いわけではない、だけで使用ではなく、(1 N +)怠惰の請求書の積極的なロードを取得するために含まロード

contracts = Contract.where(:user_id => current_user.id).includes(:invoices) 
# or this might do the same => current_user.contracts.includes(:invoices) 
invoices = contracts.map{|i| i.invoices } 

invoices.sort_by(&:updated_at).each do |invoice| 
    # .... 
end 

はデビッドSulcは、ビューを掲示何もこれを試してみて、生成されたSQLと結果をレールコンソールで実験します。 (:updated_atの)加入対含ん使用すると、他の

より多分より良い状況1に応じて、非常に異なる振る舞いを持っては.ORDER `も