假设在我的rails应用程序中我有一个模型Entry,它有一个嵌套模型Measures,这样每个条目都有多个度量(并测量belongs_to条目)。
每项措施都有自己的动力。 Entry是否有可能还有一个名为incentive的整数,其值等于其所有度量的总和?你是如何实现这一目标的?
对我来说,这似乎成了两个问题: 提交后如何根据另一个字段值定义模型字段?然后..如何在提交时根据其嵌套模型值定义值?
答案 0 :(得分:1)
尝试在嵌套属性模型中使用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
回调中使用相同的方法。
修改强>
在阅读了another question中的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
这里发生的是,每次创建或编辑一个测量时,它都会通过调用其touch method来通知其条目更新。在条目中,我们可以使用回调after_touch
来重新计算度量的总和。请注意,在创建,删除和修改度量时会调用after_touch
- 回调。
与我之前的方法相比,这种方法将责任放在Entry对象上,这从设计的角度来说是有利的。