我想知道在创建ActiveRecord对象时,回调和验证的调用顺序是什么。
假设我有一些自定义验证和回调,如下所示:
validates :reference_code, :if => :reference_code, :on => :create
before_create :assign_reference
哪一个将首先运行?2回调需要首先发生,否则验证可能会失败。
我想知道在创建ActiveRecord对象时,回调和验证的调用顺序是什么。
假设我有一些自定义验证和回调,如下所示:
validates :reference_code, :if => :reference_code, :on => :create
before_create :assign_reference
哪一个将首先运行?2回调需要首先发生,否则验证可能会失败。
3条答案
按热度按时间omjgkv6w1#
最新版本的Rails列表可以在
ActiveRecord::Callbacks
documentation中找到。Rails 4、3和2的列表如下。导轨4
这个列表的最新版本可以在Rails 4指南中找到。
创建对象
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
after_update
个after_save
after_commit/after_rollback
销毁对象
after_destroy
after_commit/after_rollback
导轨3
这个列表的最新版本可以在Rails 3指南中找到。
创建对象
before_validation
after_validation
around_save
before_create
after_create
更新对象
before_validation
before_save
销毁对象
after_destroy
导轨2
此列表的最新版本可以在Rails 2.3指南中找到
创建对象
before_validation
before_validation_on_create
个after_validation
个before_save
before_create
after_create
个更新对象
before_validation
after_validation
个after_validation_on_update
个before_update
个after_save
个销毁对象
before_destroy
DELETE
操作 *after_destroy
由于您需要首先验证
reference_code
,因此assign_reference
方法可以在after_validation
回调中调用,也可以在上面提供的列表中出现在它之后的任何回调中调用。n6lpvg4x2#
导轨5
以下是所有可用的活动记录回调的列表,按在相应操作期间调用它们的相同顺序列出:
1创建对象
before_validation
after_validation
before_save
around_save
before_create
around_create
after_create
after_save
after_commit/after_rollback
2更新对象
before_validation
after_validation
before_save
个around_save
before_update
around_update
after_save
个after_commit/after_rollback
3销毁对象
before_destroy
after_commit/after_rollback
after_save
在创建和更新时都运行,但总是在更具体的回调after_create
和after_update
之后运行,而不管宏调用的执行顺序如何。before_destroy
回调应放在dependent: :destroy
关联之前(或使用prepend:true选项),以确保它们在dependent: :destroy
删除记录之前执行。xhv8bpkk3#
除了知道每种回调的调用顺序之外,了解同一类型的多个回调的执行顺序也很重要。
before_*
钩子按照您定义的顺序执行,但是after_*
钩子是按照 reverse 顺序执行的。如果您不知道的话,这可能会令人惊讶。https://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#module-ActiveRecord::Callbacks-label-Ordering+callbacks