0

我有两个 Rails 3 模型,ProductRoom在下面定义。每个 Room 可以有多个产品,每个产品可以在多个房间中:

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

我想在其中创建一个查询rooms_controller.rb以返回前 10 个房间的记录,并为每个房间包括推送到该房间的产品数量的计数(以了解每个房间中有多少产品)和总和Product 中的一列要求cost房间中的所有产品(以获取房间中所有产品的总成本)。调用查询后,理想情况下,我可以调用@rooms[i].total_products@rooms[i].total_cost(或类似的东西)以及 Room 字段,这样它就可以很容易地被模板消化和迭代。

我知道我可以创建 10 个不同的调用,然后以 @room.products.count 和 @room.products.sum(cost) 的形式循环遍历每个调用,但必须有一种更有效的方法......而且我有一种感觉俯瞰明显的东西。

谢谢!!

4

1 回答 1

1

天真的实现会让你做 N+1 个查询......

如果您只想有效地计算您的产品,我建议您实施:counter_cache

尽管您还想执行计算(成本总和),但更希望使用房间查询预先加载产品。这个想法是返回您的房间列表及其产品。

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

如果有进一步提高效率的愿望,您可能希望数据库也进行求和。

于 2012-06-17T21:09:49.620 回答