ActiveRecord:当方法名称作为符号传递时,不调用after_initialize

时间:2010-09-29 21:53:34

标签: ruby-on-rails activerecord

我注意到当回调符号作为输入传递时,Rails不会触发after_initialize回调。

以下代码不起作用。

class User < ActiveRecord::Base
  after_initialize :init_data

  def init_data
    puts "In init_data"
  end

end

以下代码有效。

class User < ActiveRecord::Base

  def after_initialize 
    init_data
  end

  def init_data
    puts "In init_data"
  end
end

有人可以解释这种行为吗?

注1

ActiveRecord documentation说明以下关于after_initialize

的内容
Unlike all the other callbacks, after_find and after_initialize will 
only be run if an explicit implementation is defined (def after_find). 
In that case, all of the callback types will be called. 

虽然声明after_initialize需要明确实现,但我发现上段中的第二句含糊不清,即In that case, all of the callback types will be called.什么是all of the call back types

文档中的代码示例有一个不使用显式实现的示例:

after_initialize EncryptionWrapper.new

2 个答案:

答案 0 :(得分:7)

根据documentation,您无法对after_initializeafter_find回调使用宏样式类方法:

  

after_initialize和after_find   回调有点不同   其他。他们之前没有*   同行,唯一的方法   注册它们是通过将它们定义为   常规方法。如果你试着   注册after_initialize或   after_find使用宏样式类   方法,他们将被忽略。   此行为是由于性能   原因,因为after_initialize和   将同时调用after_find   在数据库中找到的每条记录,   显着放慢了   查询。

简而言之,您必须定义after_initialize实例方法:

class User < ActiveRecord::Base

  def after_initialize
    do_stuff
  end

end

答案 1 :(得分:0)

我很确定符号调用的方法需要保护或隐私。

编辑:是的,这是Rails 3 documentation

  

方法引用回调通过指定对象

中可用的受保护或私有方法来工作