轨。保存时更新模型属性

时间:2013-07-21 07:43:22

标签: ruby-on-rails model attributes callback

认为这是一项简单的任务,但我对此问题略有不满:

想要保存模型的其中一个属性,从而在模型中进行回调:

after_save :calculate_and_save_budget_contingency

def calculate_and_save_budget_contingency
  self.total_contingency = self.budget_contingency + self.risk_contingency
  self.save
  # => this doesn't work as well.... self.update_attribute :budget_contingency, (self.budget_accuracy * self.budget_estimate) / 1
end

网络服务器回传消息ActiveRecord::StatementInvalid (SystemStackError: stack level too deep: INSERT INTO "versions"

这基本上告诉我有一个向模型保存的infite循环,after_save然后我们再次保存模型...进入另一个saving模型的循环

这个模型属性计算只是停留在这个时间点。如果有人遇到过这个问题,并且有一个漂亮的俏皮/轨道解决方案,请在下面给我发一条消息,谢谢

2 个答案:

答案 0 :(得分:2)

将您的代码更改为以下

before_save :calculate_and_save_budget_contingency

def calculate_and_save_budget_contingency
  self.total_contingency = self.budget_contingency + self.risk_contingency
end

原因是 - 如果你在after_save中运行保存,你最终会进入无限循环:一个保存调用after_save回调,它调用保存哪些调用after_save,...

一般来说,只有在保存后才能更改相关模型等,这是明智的。

答案 1 :(得分:1)

尝试使用before_save或before_validation,但不要包含.save