有什么区别:
after_create :after_create
和after_commit :after_commit_on_create, :on => :create
这些可以互换使用吗?
有什么区别:
after_create :after_create
和after_commit :after_commit_on_create, :on => :create
这些可以互换使用吗?
它们不可互换。关键区别在于回调何时运行。在 的情况下after_create
,这将始终在save
(or create
) 的调用返回之前。
Rails 将每个事务包装save
在事务中,并且在该事务中运行之前/之后的创建回调(这样做的结果是,如果在 after_create 中引发异常,则保存将被回滚)。使用after_commit
,您的代码在提交最外层事务之后才会运行。这可能是创建的事务轨道或由您创建的一个(例如,如果您想在单个事务中进行多项更改)。
在after_save/create
运行时,您的保存仍然可以回滚并且(默认情况下)对其他数据库连接(例如,sidekiq 等后台任务)不可见。这两者的某种组合通常是使用after_commit
.
这两者在关联方面有一个主要区别。一旦对给定对象触发插入查询,并且在对象关联的插入查询之前,就会调用 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
导轨 5
您after_create_commit :method_name
只能在创建时调用此回调。
警告
在同一个模型中同时使用after_create_commit
和after_update_commit
只允许最后定义的回调生效,并会覆盖所有其他回调。
来源:https ://guides.rubyonrails.org/active_record_callbacks.html