9

我在模型中有带有 has_many 关联的表“订单”和“项目”。

class Order < ActiveRecord::Base
has_many :items

class Item < ActiveRecord::Base
belongs_to :order

Item 由“quantity”字段组成,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 是否支持自动跟踪关联中某些字段的总和?

谢谢

4

2 回答 2

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 字段的代码。您会发现,因为方法的名称与字段名称相同(您一定不要忘记删除),您不必重构任何使用它的代码。

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

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

于 2011-08-08T12:40:54.387 回答
0

我认为这颗宝石正是您要寻找的。
查看文档中的“总计而不是计数”。
它应该允许你这样做:

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
于 2016-02-09T07:28:43.197 回答