Rails:根据嵌套模型值在提交时设置值

时间:2012-11-28 01:42:03

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

假设在我的rails应用程序中我有一个模型Entry,它有一个嵌套模型Measures,这样每个条目都有多个度量(并测量belongs_to条目)。

每项措施都有自己的动力。 Entry是否有可能还有一个名为incentive的整数,其值等于其所有度量的总和?你是如何实现这一目标的?

对我来说,这似乎成了两个问题: 提交后如何根据另一个字段值定义模型字段?然后..如何在提交时根据其嵌套模型值定义值?

1 个答案:

答案 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对象上,这从设计的角度来说是有利的。