繁体   English   中英

rails 回调中 after_create、after_save 和 after_commit 的区别

[英]Difference between after_create, after_save and after_commit in rails callbacks

Rails 中after_createafter_saveafter_commit的区别在于:

  • after_save在创建和更新对象时调用
  • after_commit在创建、更新和销毁时被调用。
  • after_create仅在创建对象时调用

这是它们之间唯一的区别,还是还有其他主要区别?

你几乎猜对了。 但是after_commitafter_createafter_save之间有一个主要区别,即

after_create的情况下,这将始终在调用 save(或 create)返回之前。

Rails 将每次保存都包装在一个事务中,并且在该事务中运行 before/after create 回调(其结果是,如果在 after_create 中引发异常,则保存将回滚)。 使用after_commit ,您的代码直到最外层事务提交后才会运行。 这可能是创建的事务轨道或由您创建的轨道(例如,如果您想在单个事务中进行多项更改)。 最初发布在这里

这也意味着,如果after_commit引发异常,则事务将不会回滚。

使用回调顺序

after_create -

在 Model.save 之后对尚未保存的新对象调用(不存在记录)

after_save -

在 Model.save 之后调用(无论是创建还是更新保存)

after_commit -

在数据库事务完成后调用。

此外,即使仅触及记录, after_commit 也会执行。 这可能不是您想要的。 after_save 将不会在触摸后运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM