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

时间:2014-04-17 03:19:25

标签: ruby-on-rails activerecord 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不属于其中任何三个。我对么?感谢。

1 个答案:

答案 0 :(得分:18)

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

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

来自API

  每个都会触发

after_findafter_initialize回调   由查找程序找到并实例化的对象   在实例化新对象后触发after_initialize   同样。

来自Guides

  

只要有Active,就会调用after_initialize回调   记录对象是通过直接使用new或者a来实例化的   记录从数据库加载。避免这种需要可能很有用   直接覆盖您的Active Record初始化方法。

     

每当Active Record加载时,都会调用after_find回调   来自数据库的记录。之前调用after_find   after_initialize如果两者都已定义。

     

after_initializeafter_find回调没有 before_ *   对应的,但它们可以像其他Active一样注册   记录回调。

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>

after_initializeafter_find置于AR对象生命周期的哪个位置?

由于它们与所有其他回调不同,并且它们没有 before_ *对应物,因此作者(在此处引用Guides作者)可能对放置感兴趣它们是分开的,因为它们是特例。

最后我同意将after_initialize放在before_validation之前。情况可能就是这样。