after_create:foo vs after_commit:bar,:on => :创建

时间:2013-04-01 15:31:38

标签: ruby-on-rails

之间有什么区别:

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

这些可以互换使用吗?

3 个答案:

答案 0 :(得分:87)

它们不可互换。关键的区别在于回调运行时。如果是after_create,则会始终在调用save(或create)之前返回。

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

路轨5

您可以使用after_create_commit :method_name仅在创建时调用此回调。

警告

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

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