ruby-on-rails ActiveRecord回调和验证的顺序是什么?

vatpfxk5  于 2022-11-19  发布在  Ruby
关注(0)|答案(3)|浏览(170)

我想知道在创建ActiveRecord对象时,回调和验证的调用顺序是什么。
假设我有一些自定义验证和回调,如下所示:

validates :reference_code, :if => :reference_code, :on => :create
before_create :assign_reference

哪一个将首先运行?2回调需要首先发生,否则验证可能会失败。

omjgkv6w

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
  • x1米15英寸
  • after_update
  • after_save
  • after_commit/after_rollback

销毁对象

  • x1米19英寸1x
  • x1米20英寸
  • after_destroy
  • after_commit/after_rollback

导轨3

这个列表的最新版本可以在Rails 3指南中找到。

创建对象

  • before_validation
  • after_validation
  • x1米25英寸
  • around_save
  • before_create
  • x1米28英寸1x
  • after_create
  • x1米30英寸

更新对象

  • before_validation
  • x1米32英寸
  • before_save
  • x1米34英寸
  • x1米35英寸
  • x1米36英寸
  • x1米37英寸
  • x1米38英寸

销毁对象

  • x1米39英寸
  • x1米40英寸
  • after_destroy

导轨2

此列表的最新版本可以在Rails 2.3指南中找到

创建对象

  • before_validation
  • before_validation_on_create
  • after_validation
  • x1米45英寸
  • before_save
  • before_create
    • 操作
  • after_create
  • x1米50英寸

更新对象

  • before_validation
  • x1个月52个月1x
  • after_validation
  • after_validation_on_update
  • x1米55英寸1x
  • before_update
    • 操作
  • x1米58英寸
  • after_save

销毁对象

  • before_destroy
  • *DELETE操作 *
  • after_destroy

由于您需要首先验证reference_code,因此assign_reference方法可以在after_validation回调中调用,也可以在上面提供的列表中出现在它之后的任何回调中调用。

n6lpvg4x

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
  • x1米15英寸
  • after_save
  • after_commit/after_rollback

3销毁对象

  • before_destroy
  • x1米19英寸1x
  • x1米20英寸
  • after_commit/after_rollback

after_save在创建和更新时都运行,但总是在更具体的回调after_createafter_update之后运行,而不管宏调用的执行顺序如何。
before_destroy回调应放在dependent: :destroy关联之前(或使用prepend:true选项),以确保它们在dependent: :destroy删除记录之前执行。

xhv8bpkk

xhv8bpkk3#

除了知道每种回调的调用顺序之外,了解同一类型的多个回调的执行顺序也很重要。before_*钩子按照您定义的顺序执行,但是after_*钩子是按照 reverse 顺序执行的。如果您不知道的话,这可能会令人惊讶。
https://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#module-ActiveRecord::Callbacks-label-Ordering+callbacks

相关问题