跟踪协会中某些字段的总和 - "sum_cache"

jay*_*dra 9 counter-cache ruby-on-rails-3

我在模型中有has_many关联的表'orders'和'items'.

class Order < ActiveRecord::Base
has_many :items

class Item < ActiveRecord::Base
belongs_to :order
Run Code Online (Sandbox Code Playgroud)

项目由"数量"字段组成,订单由"quantity_sum"字段组成,用于跟踪关联项目数量的总和.

例如:

Order 1 : name='Toms shopping cart', quantity_sum=12
Item 1 : name='T-shirt', quantity=10
Itme 2 : name='Shoes',   quantity=2
Run Code Online (Sandbox Code Playgroud)

我一直在寻找一种方法,以便每当添加/编辑/删除新项目时,Order的字段'quantity_sum'会自动更新.目前我一直在Item中使用after_save方法来更新Order的'quantity_sum'字段.

除了'after_save'之外还有其他任何简洁的方法吗?

与用于跟踪关联计数的"counter_cache"类似,rails是否支持自动跟踪关联中某些字段的总和?

谢谢

jam*_*esc 3

从表中删除Quantity_sum字段,并将Quantity_sum方法添加到订单类中,以对Quantity_values进行求和

class Order < ActiveRecord::Base
  has_many :items

  def quantity_sum
    self.items.sum(:quantity)
  end
end
Run Code Online (Sandbox Code Playgroud)

应该做到这一点。然后您需要做的就是删除您可能拥有的用于更新数量总和字段的任何代码。您会发现,由于方法的名称与字段名称相同(您一定不要忘记删除),因此您不必重构任何使用它的代码。

显然,您需要小心,不要在不必要的情况下使用此字段,例如在系统中所有订单的列表中,因为这会对数据库造成很大的负担。对于几百条记录来说还可以,但是您会注意到数千条订单的性能问题。

不要忘记从订单表中删除Quantity_sum字段

  • 这是真的,但是只要调用 amount_sum 方法,它就会启动新的查询。如果同一订单下有大量商品,则会触发大量查询,从而导致服务器响应时间增加。为了避免这种情况,我考虑过将总和存储在数据库本身中。 (2认同)