首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rails回调中after_create、after_save和after_commit的区别

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

Stack Overflow用户
提问于 2015-11-24 09:56:40
回答 3查看 53.1K关注 0票数 87

Rails中的after_createafter_saveafter_commit的区别在于:

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

这是唯一的不同之处,还是有其他重大差异?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-24 10:05:01

你差点就猜对了。然而,after_commitafter_createafter_save有一个很大的区别。

对于after_create,这总是在调用保存(或创建)返回之前。

Rails封装事务中的每个保存,在事务中运行之前/之后的创建回调(结果是,如果在after_create中引发异常,则保存将被回滚)。使用after_commit,直到提交了最外层的事务之后,您的代码才会运行。这可以是您创建的事务rails,也可以是您创建的事务rails(例如,如果您希望在单个事务中进行多个更改)。最初发布的here

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

来自M-Dahab的评论:after_commit会在创建、更新和销毁之后运行.但是,您可以使用on:选项指定您感兴趣的内容。after_commit :some_method, on: :create,甚至after_commit :some_method, on: [:create, :destroy],或者使用像after_commit(on: :update) do run_method() end这样的块。

票数 130
EN

Stack Overflow用户

发布于 2019-03-18 11:53:20

有回调的顺序

after_create -

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

after_save -

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

after_commit -

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

票数 32
EN

Stack Overflow用户

发布于 2021-07-29 19:56:45

而且,即使只触及记录,after_commit也会执行。这可能不是你想要的。after_save不会在触摸后运行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33890458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档