Rails. 在保存时更新模型属性

3

虽然这是一项简单的任务,但我在处理这个问题时遇到了一些困难:

希望每当保存模型时更新其中一个属性,因此在模型中有一个回调函数:

after_save :calculate_and_save_budget_contingency
def calculate_and_save_budget_contingency self.total_contingency = self.budget_contingency + self.risk_contingency self.save # => 这也不起作用.... self.update_attribute :budget_contingency, (self.budget_accuracy * self.budget_estimate) / 1 end

然后Web服务器会返回以下消息:ActiveRecord :: StatementInvalid(SystemStackError:stack level too deep: INSERT INTO“versions”

这基本上告诉我,模型中存在无限循环的保存,after_save 然后我们再次保存模型……这又进入了保存模型的另一个循环

目前卡在这个模型属性计算的阶段。如果有人遇到过这个问题,并且有一个很好的nifty / rails解决方案,请在下面留言,谢谢。


1
无限递归。在 after_save 操作中调用了 save。 - undefined
2个回答

3

请将您的代码更改为以下内容

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,以此类推...

总的来说,智慧的做法是仅在更改关联模型等情况下使用after_save


1
从这个 INSERT INTO "versions" 我推断你也有一些版本控制的机制吗? - undefined

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

伙计,你可能不知道你在写什么...看一下Rails模型回调函数。http://apidock.com/rails/ActiveRecord/Callbacks/after_save - undefined
呃..真是鬼扯。你标记为正确的解决方案完全做了同样的事情。他切换到before_save,并且该方法并没有调用self.save。这正是我建议的,而你却对我投下负票并告诉我不懂我在写什么? - undefined
@bratsche 奇怪,这是相同的解决方案。我给你的答案点了赞 =) - undefined
大家,如果你们仔细看一下问题和答案的内容,就会明白为什么bratsche提供的解决方案是错误的。 - undefined
@bratsche,是的,伙计,你说得对,他之前使用了before_save,并没有调用self.save,这对我来说似乎是个问题。 - undefined
2
基本上你给我点踩,对我傲慢不屑一顾,然后看到我确实回答了你的问题,却不费心撤销你的点踩。谢谢。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接