更新
我错误地参考了edgerails指南,而不是当前正确的Rails 3指南(其中没有提到after_initialize)。尽管如此,我不确定为什么edgerails指南是“不正确”的 - 我认为edgerails指南应该是最新的指南?
我保留这个问题,以防有人寻找相同的“问题”。
调用 after_initialize
的宏式风格是可行的方法。
应该使用方法调用还是宏式调用来使用after_initialize
?
这种方式可以工作,但会产生废弃警告:
def after_initialize
logger.info "Called after_initialize"
end
废弃警告:Base#after_initialize已被弃用,请改用Base.after_initialize:method。
这样可以工作,而且没有警告:
after_initialize :do_this_after_initialize
def do_this_after_initialize
logger.info "Called after_initialize"
end
但是在《Active Record Validations and Callbacks Guide》的第10.4节"after_initialize和after_find"中指出:如果你尝试使用宏风格的类方法来注册 after_initialize 或 after_find,它们将会被忽略。这种行为是由于性能原因,因为每找到一个数据库记录,都会调用 after_initialize 和 after_find,从而显著降低查询速度……所以这意味着相对于方法风格的方式,宏风格的使用效率较低吗?(我猜这个指南是错的,因为代码是王道:D)
另一个更新
2011年1月28日的提交记录表明,正确的方式仍然是使用宏风格调用,而不是
def after_initialize
方式。