rails回调中after_create,after_save和after_commit之间的区别

时间:2015-11-24 09:56:41

标签: ruby-on-rails ruby activerecord callback

Rails中after_createafter_saveafter_commit之间的区别在于:

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

这是它们之间的唯一区别还是存在其他主要差异?

3 个答案:

答案 0 :(得分:41)

你几乎做对了。但是,after_commitafter_createafter_save之间存在一个主要差异,即

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

Rails包装事务中的每个保存,并且在该事务内部运行之前/之后的创建回调(这样做的结果是,如果在after_create中引发异常,则将回滚保存)。使用after_commit,您的代码在最外层事务提交之后才会运行。这可以是创建的事务轨道或由您创建的事务轨道(例如,如果您想在单个事务中进行多处更改)。最初发布here

这也意味着,如果after_commit引发异常,那么交易将不会回滚。

答案 1 :(得分:3)

具有回调顺序

创建后-

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

之后保存-

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

提交后-

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

答案 2 :(得分:0)

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