认为这是一项简单的任务,但我对此问题略有不满:
想要保存模型的其中一个属性,从而在模型中进行回调:
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
模型的循环
这个模型属性计算只是停留在这个时间点。如果有人遇到过这个问题,并且有一个漂亮的俏皮/轨道解决方案,请在下面给我发一条消息,谢谢
答案 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