以下两者之间有什么区别吗

after_create :after_createafter_commit :after_commit_on_create, :on => :create

这些可以互换使用吗?

推荐答案

它们不能互换.关键的区别在于回调何时运行.在after_create的情况下,这总是在save(或create)的呼叫返回之前.

如果在Rails中运行的每个事务都是,则在该事务中创建一个异常后再运行.对于after_commit,您的代码在提交最外层的事务之后才会运行.这可以是创建的事务轨道,也可以是您创建的事务轨道(例如,如果您希望在单个事务中进行多个更改).

在运行after_save/create次时,您的保存仍然可以回滚,并且(默认情况下)对其他数据库连接(例如,sidekiq之类的后台任务)不可见.这二者的某种结合通常是使用after_commit的动机.

Ruby-on-rails相关问答推荐

无法加载此类文件 -- mysql2/mysql2

Rails 6.1、Ruby 3.0.0:测试错误,因为它们无法加载 rexml

带有 master.key 的 Rails 5.2 - Heroku 部署

在 Rails 5.1 及更高版本中使用什么来代替`render :text`(和`render nothing: true`)?

FactoryBot 工厂中的“临时执行”块的目的是什么?

rails db:migrate vs rake db:migrate

禁用冻结字符串文字注释判断

Rails 服务器仍在新打开的 docker 容器中运行

Rails 5:无法从参数中检索哈希值

Redis 引发“需要 NOAUTH 身份验证”错误,但没有设置密码

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

Rails 4 - Gem :: LoadError:为数据库适配器指定'mysql2',但未加载gem

CAS 与 SAML 与 OAuth2

错误消息:在Bundle 之前确保 `gem install pg -v '0.18.1'` 成功

ActiveRecord where field = ?可能值的数组

jbuilder vs rails-api/active_model_serializers 用于 Rails 4 中的 JSON 处理

搭建脚手架时建立关系

Rails 4:如何重置测试数据库?

如何从 Rails 中的枚举中获取整数值?

heroku open - 未指定应用程序