52

有什么区别:

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

这些可以互换使用吗?

4

3 回答 3

100

它们不可互换。关键区别在于回调何时运行。在 的情况下after_create,这将始终在save(or create) 的调用返回之前。

Rails 将每个事务包装save在事务中,并且在该事务中运行之前/之后的创建回调(这样做的结果是,如果在 after_create 中引发异常,则保存将被回滚)。使用after_commit,您的代码在提交最外层事务之后才会运行。这可能是创建的事务轨道或由您创建的一个(例如,如果您想在单个事务中进行多项更改)。

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

于 2013-04-01T23:53:57.087 回答
5

这两者在关联方面有一个主要区别。一旦对给定对象触发插入查询,并且在对象关联的插入查询之前,就会调用 after_create。这意味着关联对象的值可以直接在 after_create 回调中更改,而无需更新查询。

class Post < ActiveRecord::Base
  has_one :post_body
  after_create :change_post_body

  def change_post_body
    self.post_body.content = "haha"
    #No need to save
  end 
end
于 2015-10-23T07:26:47.653 回答
0

导轨 5

after_create_commit :method_name只能在创建时调用此回调。

警告

在同一个模型中同时使用after_create_commitafter_update_commit只允许最后定义的回调生效,并会覆盖所有其他回调。

来源:https ://guides.rubyonrails.org/active_record_callbacks.html

于 2019-06-05T13:39:06.157 回答