0

Rails 3 モデルが 2 つあり、以下のようProductRoom定義されています。各ルームには複数の製品を含めることができ、各製品は複数のルームに含めることができます。

class Product < ActiveRecord::Base
  #...
  has_many :rooms, :through => :product_selection
  has_many :product_selection
end

class Room < ActiveRecord::Base
  #...
  has_many :products, :through => :product_selection
  has_many :product_selection
end

class ProductSelection < ActiveRecord::Base
  #...
  belongs_to :product
  belongs_to :room
end

最初の 10 部屋のレコードを返すクエリを作成したいと思いますrooms_controller.rb。各部屋には、その部屋にプッシュされた製品の数 (各部屋にいくつの製品があるかを調べるため) と合計が含まれます。ルーム内のすべての製品に対して呼び出される Product 内の列cost(ルーム内のすべての製品の合計コストを取得するため)。クエリを呼び出した後、Room フィールドと一緒に@rooms[i].total_productsand (または同様のもの) を呼び出して、テンプレートで簡単に消化して反復できるようにすることが理想的です。@rooms[i].total_cost

@room.products.count と @room.products.sum(cost) として 10 個の異なる呼び出しを作成し、それぞれをループできることはわかっていますが、もっと効率的な方法が必要です...明らかな何かを見落としています。

ありがとう!!

4

1 に答える 1

1

単純な実装では、N+1クエリを実行する必要があります...

製品を効率的にカウントしたい場合は、:counter_cacheを実装することをお勧めします

計算(コストの合計)も実行する必要があるため、部屋のクエリを使用して製品を積極的にロードする方が望ましいでしょう。部屋とその製品のリストを返すというアイデア。

room_array = Room.includes(:products).limit(10)

これを効率的にしたいというさらなる要望があった場合は、データベースにも合計を実行させることをお勧めします。

于 2012-06-17T21:09:49.620 に答える