57

我想知道创建 ActiveRecord 对象时调用的回调和验证的顺序是什么。

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

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

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

4

2 回答 2

132

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

导轨 4

这个列表的最新版本可以在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

导轨 3

此列表的最新版本可以在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

导轨 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我上面提供的列表中出现在它之后的任何回调中调用该方法。

于 2012-06-13T18:35:59.387 回答
4

导轨 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在创建和更新时都运行,但总是在更具体的回调之后运行,after_create并且after_update无论宏调用的执行顺序如何。

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

于 2019-03-21T06:30:05.120 回答