如何在Rails 3中使用'after_initialize'?

18

更新

我错误地参考了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方式。

3
我举例使用after_initialize来构建关联。例如:after_initialize :build_text, :unless => :text。在使用accepts_nested_attributes_for时非常有帮助。 - Dmitry Polushkin
这是一个更新的链接,关于Rails 4指南中的after_initialize(http://guides.rubyonrails.org/active_record_callbacks.html#after-initialize-and-after-find) - stereoscott
1个回答

10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接