我想知道创建 ActiveRecord 对象时调用的回调和验证的顺序是什么。
假设我有一些自定义验证和回调,如下所示:
validates :reference_code, :if => :reference_code, :on => :create
before_create :assign_reference
哪个会先运行?回调需要首先发生,否则验证可能会失败。
我想知道创建 ActiveRecord 对象时调用的回调和验证的顺序是什么。
假设我有一些自定义验证和回调,如下所示:
validates :reference_code, :if => :reference_code, :on => :create
before_create :assign_reference
哪个会先运行?回调需要首先发生,否则验证可能会失败。
最新版本的 Rails 列表的最新版本可以在ActiveRecord::Callbacks
文档中找到。Rails 4、3 和 2 的列表如下。
这个列表的最新版本可以在Rails 4 Guides中找到。
before_validation
after_validation
before_save
around_save
before_create
around_create
after_create
after_save
after_commit/after_rollback
before_validation
after_validation
before_save
around_save
before_update
around_update
after_update
after_save
after_commit/after_rollback
before_destroy
around_destroy
after_destroy
after_commit/after_rollback
此列表的最新版本可以在Rails 3 Guides中找到。
before_validation
after_validation
before_save
around_save
before_create
around_create
after_create
after_save
before_validation
after_validation
before_save
around_save
before_update
around_update
after_update
after_save
before_destroy
around_destroy
after_destroy
此列表的最新版本可以在Rails 2.3 指南中找到
before_validation
before_validation_on_create
after_validation
after_validation_on_create
before_save
before_create
INSERT
手术after_create
after_save
before_validation
before_validation_on_update
after_validation
after_validation_on_update
before_save
before_update
UPDATE
手术after_update
after_save
before_destroy
DELETE
手术after_destroy
由于您需要首先验证reference_code
,因此assign_reference
可以在回调中调用该方法,也可以在after_validation
我上面提供的列表中出现在它之后的任何回调中调用该方法。
这是一个包含所有可用 Active Record 回调的列表,按照在相应操作期间调用它们的顺序列出:
before_validation
after_validation
before_save
around_save
before_create
around_create
after_create
after_save
after_commit/after_rollback
before_validation
after_validation
before_save
around_save
before_update
around_update
after_update
after_save
after_commit/after_rollback
before_destroy
around_destroy
after_destroy
after_commit/after_rollback
after_save
在创建和更新时都运行,但总是在更具体的回调之后运行,after_create
并且after_update
无论宏调用的执行顺序如何。
before_destroy
回调应该放在dependent: :destroy
关联之前(或使用 prepend: true 选项),以确保它们在记录被删除之前执行dependent: :destroy
。