如何在Rails 3中使用'after_initialize'?
如何在Rails 3中使用'after_initialize'?
更新
我错误地查看了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验证和回调指南的10.4 after_initialize and after_find中,有这样的说明:
...如果您尝试使用宏式类方法注册after_initialize或after_find,它们将被忽略。这种行为是由于性能原因,因为对于在数据库中找到的每个记录,都将调用after_initialize和after_find,从而显着减慢了查询速度...
所以这意味着宏式用法与方法式用法相比效率低下?
(我猜指南是错误的,因为代码是王道 :D)
另一个更新
来自2011年1月28日的此提交建议仍然使用宏式调用,而不是def after_initialize
。
在Rails 3中,使用'after_initialize'回调函数的问题是由于模型中的回调函数没有正确使用宏样式引起的。在Rails中,回调函数是一种在模型的生命周期中自动触发的方法,它们可以在模型对象的特定事件发生时执行特定的代码。在这种情况下,'after_initialize'回调函数是在模型对象被初始化之后调用的。
解决这个问题的方法是确保正确地使用宏样式来定义回调函数。在模型中,应该使用'after_initialize'方法来定义回调函数,并将所需的代码放在块中。以下是一个示例:
class YourModel < ActiveRecord::Base after_initialize do # 在模型对象被初始化之后执行的代码 end end
通过将所需的代码放在'after_initialize'块中,可以确保在模型对象被初始化之后自动触发相应的代码。这样就可以在模型对象被实例化时执行所需的操作。
总之,要在Rails 3中正确使用'after_initialize'回调函数,需要将回调函数定义为宏样式,并将所需的代码放在'after_initialize'块中。这样可以确保在模型对象被实例化之后自动触发相应的代码。