我想知道创建 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_validationafter_validationbefore_savearound_savebefore_createaround_createafter_createafter_saveafter_commit/after_rollbackbefore_validationafter_validationbefore_savearound_savebefore_updatearound_updateafter_updateafter_saveafter_commit/after_rollbackbefore_destroyaround_destroyafter_destroyafter_commit/after_rollback此列表的最新版本可以在Rails 3 Guides中找到。
before_validationafter_validationbefore_savearound_savebefore_createaround_createafter_createafter_savebefore_validationafter_validationbefore_savearound_savebefore_updatearound_updateafter_updateafter_savebefore_destroyaround_destroyafter_destroy此列表的最新版本可以在Rails 2.3 指南中找到
before_validationbefore_validation_on_createafter_validationafter_validation_on_createbefore_savebefore_createINSERT手术after_createafter_savebefore_validationbefore_validation_on_updateafter_validationafter_validation_on_updatebefore_savebefore_updateUPDATE手术after_updateafter_savebefore_destroyDELETE手术after_destroy由于您需要首先验证reference_code,因此assign_reference可以在回调中调用该方法,也可以在after_validation我上面提供的列表中出现在它之后的任何回调中调用该方法。
这是一个包含所有可用 Active Record 回调的列表,按照在相应操作期间调用它们的顺序列出:
before_validationafter_validationbefore_savearound_savebefore_createaround_createafter_createafter_saveafter_commit/after_rollbackbefore_validationafter_validationbefore_savearound_savebefore_updatearound_updateafter_updateafter_saveafter_commit/after_rollbackbefore_destroyaround_destroyafter_destroyafter_commit/after_rollbackafter_save在创建和更新时都运行,但总是在更具体的回调之后运行,after_create并且after_update无论宏调用的执行顺序如何。
before_destroy回调应该放在dependent: :destroy关联之前(或使用 prepend: true 选项),以确保它们在记录被删除之前执行dependent: :destroy。