Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 轨道。保存时更新模型属性_Ruby On Rails_Model_Attributes_Callback - Fatal编程技术网

Ruby on rails 轨道。保存时更新模型属性

Ruby on rails 轨道。保存时更新模型属性,ruby-on-rails,model,attributes,callback,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

虽然这是一项简单的任务,但我对这个问题有点执着:

希望在保存时更新模型的一个属性,从而在模型中具有回调:

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 保存后:计算并保存预算 def计算并保存预算意外开支 self.total\u意外开支=self.budget\u意外开支+self.risk\u意外开支 自救 #=>这也不行。。。。self.update\u属性:预算应急,(self.budget\u准确性*self.budget\u估算)/1 结束 然后Web服务器返回消息
ActiveRecord::StatementInvalid(SystemStackError:堆栈级别太深:插入“版本”

这基本上告诉我有一个保存到模型的内循环,
在保存之后,
然后我们再次保存模型…这进入另一个
保存
模型的循环


在这个模型属性计算的时候遇到了问题。如果有人遇到了这个问题,并且有一个很好的/rails解决方案,请在下面给我发一条消息,谢谢,请在保存之前或验证之前尝试,但不要包括.save,请将代码更改为以下内容

before_save :calculate_and_save_budget_contingency

def calculate_and_save_budget_contingency
  self.total_contingency = self.budget_contingency + self.risk_contingency
end
原因是-如果您在保存后运行save in
,您将进入无限循环:save在保存后调用callback,它调用save,而在保存后调用save,这


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

Mate,你可能不知道你在写什么。看看Rails模型回调。嗯..wtf。你标记为正确的解决方案做了完全相同的事情。他切换到保存前,该方法不调用self.save。这是正确的我的建议是什么,你否决了我,告诉我我不知道我在写什么?@bratsche奇怪,这是同一个解决方案。对你的答案投赞成票=)伙计们,如果你检查一下问题和答案中写的内容,你就会明白为什么bratsche提供的解决方案是错误的,所以基本上你否决了我,屈尊于我,然后看看我是否回答了你的问题,但不要费心撤销你的否决票。谢谢。从这个
插入到“versions”
中,我想你也有一些版本控制?无限递归。您正在后置保存操作中调用保存