我注意到当回调符号作为输入传递时,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
答案 0 :(得分:7)
根据documentation,您无法对after_initialize
或after_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)