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指南中找到此列表的最新版本.
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指南中找到此列表的最新版本.
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回调中调用该方法,或者在我上面提供的列表中出现后面的任何回调.
小智 6
以下是包含所有可用 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在 create 和 update 上运行,但始终在更具体的回调after_create和后运行after_update,无论宏调用的执行顺序如何。
before_destroy回调应放置在dependent: :destroy关联之前(或使用 prepend: true 选项),以确保它们在 删除记录之前执行dependent: :destroy。