Rails中after_create
,after_save
和after_commit
之间的区别在于:
after_save
在创建和更新对象时被调用after_commit
。 after_create
仅在创建对象时调用这是它们之间的唯一区别还是存在其他主要差异?
答案 0 :(得分:41)
你几乎做对了。但是,after_commit
和after_create
或after_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 不会在触摸后运行。