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

时间:2011-08-08 08:49:10

标签: ruby-on-rails-3 counter-cache

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

class Order < ActiveRecord::Base
has_many :items

class Item < ActiveRecord::Base
belongs_to :order

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

例如:

Order 1 : name='Toms shopping cart', quantity_sum=12
Item 1 : name='T-shirt', quantity=10
Itme 2 : name='Shoes',   quantity=2

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

除了'after_save'之外,还有其他任何巧妙的方法吗?

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

由于

2 个答案:

答案 0 :(得分:3)

从表中删除quantity_sum字段,并将quantity_sum方法添加到汇总quantity_values的订单类

class Order < ActiveRecord::Base
  has_many :items

  def quantity_sum
    self.items.sum(:quantity)
  end
end

应该做的伎俩。您需要做的就是删除更新quantity_sum字段的任何代码。您会发现,因为方法的名称与字段名称相同(您不能忘记删除),您不必重构任何使用它的代码。

显然,您需要注意不要像系统中所有订单的列表中那样不必要地使用此字段,因为这对数据库来说非常繁重。 O.K有几百条记录,但你会注意到数千个订单的性能问题。

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

答案 1 :(得分:0)

我认为this gem正是您所寻找的 查看&#34; Totaling而不是计数&#34;在文档中。
它应该允许你这样:

class Item < ActiveRecord::Base
  belongs_to :order
  counter_culture :order, :column_name => 'quantity_sum', :delta_column => 'quantity'
end

class Order < ActiveRecord::Base
  has_many :items
end