ActiveRecord回调和验证的顺序是什么?

Abi*_*bid 51 validation activerecord ruby-on-rails ruby-on-rails-3

我想知道在创建ActiveRecord对象时调用的回调和验证的顺序.

假设我有一些自定义验证和回调,如下所示:

validates :reference_code, :if => :reference_code, :on => :create
before_create :assign_reference
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*cha 123

可以在ActiveRecord::Callbacks文档中找到最新版Rails的最新版本.Rails 4,3和2的列表如下.

Rails 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
  • around_update
  • after_update
  • after_save
  • after_commit/after_rollback

摧毁一个物体

  • before_destroy
  • around_destroy
  • after_destroy
  • after_commit/after_rollback

Rails 3

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

创建一个对象

  • 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

可以在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回调中调用该方法,或者在我上面提供的列表中出现后面的任何回调.


小智 6

轨道5

以下是包含所有可用 Active Record 回调的列表,按照在相应操作期间调用它们的顺序列出:

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_update
  • after_save
  • after_commit/after_rollback

3 销毁对象

  • before_destroy
  • around_destroy
  • after_destroy
  • after_commit/after_rollback

after_save在 create 和 update 上运行,但始终在更具体的回调after_create和后运行after_update,无论宏调用的执行顺序如何。

before_destroy回调应放置在dependent: :destroy关联之前(或使用 prepend: true 选项),以确保它们在 删除记录之前执行dependent: :destroy