更新子更新的父模型

时间:2009-06-22 20:09:45

标签: ruby-on-rails ruby activerecord

我有两个脚手架生成的模型:Book和Bookbag。书包有许多书籍,书籍属于书包。每本书都有一个重量,每个书包的平均重量应该存储其所有书籍的平均重量。保持平均体重最新的最佳方法是什么?

在Bookbag上使用保存前过滤器不起作用,因为它对包含的书籍的每次更新都没有调用,并且我不想更新每次书籍更新的平均权重,只有当书籍的权重发生变化时才会更新

2 个答案:

答案 0 :(得分:3)

快速解决方案可能是这样的:

class Book
  def before_save
    self.bookbag.update_avg if self.weight_changed?
  end
end

答案 1 :(得分:0)

如果您能够根据需要重新计算平均值,还有另一种解决方案。

class Bookbag < ActiveRecord::Base
  has_many :books

  def weight_average
    self.books.average(:weight)
  end
end

在这种情况下,您不需要任何回调,并利用数据库的能力进行计算。