2

认为这是一项简单的任务,但是我对这个问题有点坚持:

想要在保存模型时更新模型的属性之一,因此在模型中有一个回调:

after_save :calculate_and_save_budget_contingency

def calculate_and_save_budget_contingency
  self.total_contingency = self.budget_contingency + self.risk_contingency
  自我保存
  # => 这也不好用.... self.update_attribute :budget_contingency, (self.budget_accuracy * self.budget_estimate) / 1
结尾

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

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

刚好卡在这个模型属性计算的这个时间点上。如果有人遇到过这个问题,并且有一个漂亮的/rails 解决方案,请在下面给我留言,谢谢

4

2 回答 2

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,它......

一般来说,明智的做法是在保存后仅用于更改关联模型等。

于 2013-07-21T08:04:43.747 回答
1

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

于 2013-07-21T07:53:25.107 回答