2016-11-13 6 views
0

私はPRODUCTという列のテーブル請求書を持っています。私は、n + 1つのクエリを避けるために、セットアップに私のコントローラをしようとしていますrailsには2つのレベルの関連付けが複数含まれています

invoice.product.CATEGORY 
inventory.product.SUPPLIER 

:Productsテーブルは、私の見解で

が、私は表示する必要がある...などなどカテゴリ、仕入先などの他のテーブルに属しています。

だから私はなかった:

@invoices = Invoice.all.includes(product => category, product => supplier) 

私は弾丸の宝石がインストールされている、それはクエリがProduct => [category]Add to your finder::includes => [:category]

を検出したが/ SA N + 1それは含まれての唯一の最新を考慮思われることを示すと、他の人は無視してください。私は私の構文が間違っていると思います。

どうすれば修正できますか?

答えて

3

あなたのモデルを象徴しませんでした。

@invoices = Invoice.all.includes(:product => :category, :product => :supplier) 

これは、配列を使用することによって短縮することができます。

@invoices = Invoice.all.includes(:product => [:category, :supplier]) 

それは最後にあなたの.whereまたは.limit(または.all)を置くために慣用的です:

@invoices = Invoice.includes(:product => [:category, :supplier]).all 

しないのはなぜ範囲?

コントローラ

def index 
    @invoices = Invoice.with_details.all 
end 

モデル

class Invoice 
    # ... 
    def self.with_details 
    includes(:product => [:category, :supplier]) 
    end 
end 

さらに良い:

コントローラ

働いの

モデル

class Invoice 
    # ... 
    def self.with_details(num) 
    includes(:product => [:category, :supplier]).limit(num) 
    end 
end 
+0

こんにちは感謝!最後の解決策の中で私は 'scan(/ \ d /)'が何であり、何をしているのか本当に分かりません。そしてもしそれほど気にしなければ、なぜ2番目の解決策の単純な範囲よりも優れているのでしょうか? – Catmal

+0

それは本当に必要ではない、私はそれを取る必要があります。限界が実際の数であることを確認するだけです。 '.'Scan'メソッドは正規表現のマッチ(' \ d'は数字) '['1'、 '2'、 '3']'の配列を返し、それらを '['123']'に戻します。 – Eric

+0

私は私に100%明確な2番目のソリューションを使用すると思います。将来的にデバッグするために問題が発生した場合に備えて、それは優れています。再度、感謝します! – Catmal

関連する問題