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

Has*_*mad 41 ruby activerecord ruby-on-rails callback

之间的差异after_create,after_save以及after_commit在Rails的是:

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

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

Dus*_*sht 60

你几乎做对了.然而,有一个重要区别after_commit,并after_createafter_save

在这种情况下after_create,这将始终在保存(或创建)返回的调用之前.

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

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

  • `after_commit` 将在 `create`、`update` 和 `destroy` 之后运行。但是,您可以使用 `on:` 选项来指定您感兴趣的内容。 `after_commit :some_method, on: :create` 甚至 `after_commit :some_method, on: [:create, :destroy]` 或使用类似的块`after_commit(on: :update) do run_method() end`。 (6认同)
  • 在after_create的情况下,总是在保存(或创建)调用返回之前。我不明白这句话。有人可以用其他方式形容吗? (2认同)
  • 自 Rails 6+ 起,有一个简写 `after_save_commit :some_method` 相当于 `after_commit :some_method, on: [:create, :destroy]` (2认同)

Arv*_*ngh 8

带回调顺序

after_create -

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

after_save的 -

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

after_commit -

数据库事务完成后调用。