如果我在ActiveRecord模型中添加after_save回调,然后在该回调上使用update_attribute更改对象,则会再次调用该回调,因此会发生“堆栈溢出”(嘿,无法抗拒)。

是否有可能避免这种行为,可能在执行过程中禁用回调?还是有另一种方法?

谢谢!

最佳答案

一种解决方法是在类中设置一个变量,然后在after_save中检查其值。

  • 首先检查。 (如果是var)
  • 在调用update_attribute之前,将其分配为“false”值。
  • 调用update_attribute。
  • 将其分配为“true”值。
  • 结束

  • 这样,它只会尝试保存两次。这可能两次击中您的数据库,这可能是可取的,也可能是不希望的。

    我有一种模糊的感觉,就是内置了某些东西,但这是一种非常简单的方法,可以防止几乎所有应用程序中的特定递归点。
    我还建议再次查看代码,因为您在after_save中所做的任何事情都应该在before_save中完成。有时候这是不正确的,但很少见。

    关于ruby-on-rails - 使用after_save回调修改同一对象,而无需再次触发该回调(递归),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/215885/

    10-16 23:39