在Active Record对象生命周期中的after_initialize和after_find回调顺序?

Jua*_*tas 11 activerecord ruby-on-rails callback

来自Rails指南.回调可以挂钩到Active Record Object的生命周期.按执行顺序,它们(从Rails指南中复制):

创建一个对象

  • 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

我想知道在哪里放置after_initializeafter_find成以上?我认为after_initialize应该放在之前before_validation,after_find不属于任何三个.我对么?谢谢.

Pav*_*van 21

after_initializeafter_find回调是两个特殊的回调.

after_findafter_initialize事件定义回调的唯一方法是将它们定义为methods.如果你尝试将它们声明为handlers,那么它们将被默默地忽略.

来自API

after_find并且after_initialize为查找器找到并实例化的每个对象触发回调,并在实例化 after_initialize新对象后触发.

来自指南

after_initialize每当一个Active Record对象被实例化回调将被调用,通过直接使用新的或当记录从数据库加载.避免直接覆盖Active Record初始化方法可能很有用.

after_find每次活动记录从数据库加载一个记录的回调将被调用.如果两者都被定义after_find,after_initialize则在之前调用 .

after_initializeafter_find回调没有before_*同行,但他们可以注册就像其他活动记录的回调.

class User < ActiveRecord::Base
  after_initialize do |user|
    puts "You have initialized an object!"
  end

  after_find do |user|
    puts "You have found an object!"
  end
end

>> User.new
You have initialized an object!
=> #<User id: nil>

>> User.first
You have found an object!
You have initialized an object!
=> #<User id: 1>
Run Code Online (Sandbox Code Playgroud)

在哪里放置after_initializeafter_find在AR对象的生命周期?

由于他们是从所有其他不同的回调,也他们没有before_*同行,所以笔者(指向导,因为它们是特殊情况,笔者在这里)可能有兴趣将他们分开.

最后我同意after_initialize以前的说法before_validation.情况可能就是这样.

  • 谢谢你,谢谢你,谢谢你!我用Google搜索了几个小时,尝试了一切.我在老手册中读到了一个提示,即如果定义了`显式实现("def after_find"),则after_find只触发`,认为它仍然如此,错过了新指南中答案中的语法.我不认为必须在新指南中这样做.再次感谢你. (2认同)