Rails中after_createafter_saveafter_commit的区别在于:

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

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

推荐答案

你差点说对了.然而,after_commitafter_createafter_save之间有一个主要区别,即.

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

Rails将每个save包装在一个事务中,before/after create回调在该事务中运行(这样做的结果是,如果在after_create中引发异常,则save将回滚).对于after_commit,您的代码在提交最外层的事务之后才会运行.这可以是创建的事务轨道,也可以是您创建的事务轨道(例如,如果您希望在单个事务中进行多个更改).最初发布了here

也就是说,if 100 raises an exception, then the transaction won't be rolled back.

Ruby-on-rails相关问答推荐

HTTP:MimeNegotiation::InvalidType(html不是有效的MIME类型):""

在Ruby on rails中,重复访问ActiveRecordModel返回相同的对象:预期行为还是错误?

删除链接不起作用,重定向 echo 示 Ruby

Selenium chromedriver:无法从不可键入的键构造KeyEvent

你如何发布到 Capybara 中的 URL?

Rails cron 与时俱进,设置环境

耙路由错误缺少:路由定义上的操作键

用 url_for 查询参数?

在 ID 存在时获取表的未知主键

在 Windows 上安装特定的 Ruby on Rails 版本

Rails 文章助手 - a 或 an

Rails:使用 link_to 创建不带 href 的链接

我可以在 Ubuntu 上使用 apt-get 安装 gems 吗?

Rails:带参数的 URL/路径

以最Ruby 风格计算 ActiveSupport:TimeWithZone 天数的差异?

我怎样才能看到水豚在失败的黄瓜步骤中发现了什么?

如何更改 Rails 3 控制器中视图文件的默认路径?

如何拆分长行的 Ruby

Date.current 和 Date.today 有什么区别?

简单的 rails rake 任务拒绝运行并出现错误不知道如何构建任务,为什么?