假设在我的 rails 应用程序中,我有一个模型 Entry,它有一个嵌套模型Measures,这样每个条目都有_many_measures(和measures belongs_to 条目)。
每项措施都有其自身的动机。Entry 是否有可能有一个整数也称为激励,其值等于所有度量值的总和?你如何做到这一点?
对我来说,这似乎变成了一个两部分的问题:如何在提交时根据另一个字段值定义模型字段?那么..如何在提交时根据其嵌套模型值定义一个值?
假设在我的 rails 应用程序中,我有一个模型 Entry,它有一个嵌套模型Measures,这样每个条目都有_many_measures(和measures belongs_to 条目)。
每项措施都有其自身的动机。Entry 是否有可能有一个整数也称为激励,其值等于所有度量值的总和?你如何做到这一点?
对我来说,这似乎变成了一个两部分的问题:如何在提交时根据另一个字段值定义模型字段?那么..如何在提交时根据其嵌套模型值定义一个值?
尝试after_update
在嵌套属性的模型中使用回调来更新其父级:
class Measure < ActiveRecord::Base
after_update :calculate_measure_sum
...
private
def calculate_measure_sum
# calculate sum
self.entry.save
end
end
您可能还需要在after_create
回调上使用相同的方法。
编辑:
在阅读了touch
另一个问题之后,我想更新我的方法:
class Entry < ActiveRecord::Base
has_many :measures
after_touch :calculate_measure_sum
...
private
def calculate_measure_sum
# calculate sum
self.entry.save
end
end
class Measure < ActiveRecord::Base
belongs_to :entry, touch: true
...
end
这里发生的情况是,每次创建或编辑 Measure 时,它都会通过调用其touch 方法通知其 Entry 已更新。在条目中,我们可以使用回调after_touch
来重新计算度量的总和。请注意,after_touch
在创建、删除和修改度量时调用 -callback。
与我之前的方法相比,这种方法将责任放在了入口对象上,从设计的角度来看这是有利的。