1

次のデータをフェッチするためのステートメントがあります: food-serving-name、food-name、food-brand-name、および food-category。4 つのフィールドはすべて別のテーブルにあります。私はこのようなステートメントを使用しています

@food_servings = FoodServing.find(params[:food_serving_id], 
                   :include => {:food => [:food_brand,:food_category] })

以下は私のモデルです

FoodServing  belongs_to    Food
                           Food         belongs_to    FoodCategory
                           Food         belongs to    FoodBrand

上記のステートメントを実行すると、多くの SQL ステートメントが実行されていることがログに表示されます。明らかにこれは N+1 の問題です。find メソッドに間違った include パラメータを渡していると思います。誰かがこの呼び出しを最適化するのを手伝ってくれますか?

4

1 に答える 1

1

私はしばらく Rails 3 だけを使用してきましたが、Rails 2 で AR の N+1 クエリの問題を解決する正しい方法だと確信しています。

さまざまな FoodServing レコードに対してその行全体を 100x 実行している場合でも、最適化は各 FoodServing.find 呼び出しにのみ適用され、すべてをまとめて適用するわけではないため、大量の db ヒットが表示されます。

この時点で、ログからさらに情報が必要になると思います。予想よりも頻繁にロードされているレコードはどれですか?

于 2011-06-28T20:18:32.770 に答える