我有这个:
class Bullet < ActiveRecord::Base
include StagedVersionMethods
...
end
这个
module StagedVersionMethods
def initialize
puts self.bullet_id
end
end
当我创建一个Bullet实例时,模块初始化方法fires,但是我得到一个ActiveRecord错误: ... activerecord-2.2.2 / lib / active_record / attribute_methods.rb:268:在`read_attribute'
我的目的是初始化一个实例变量,我需要将我正在混合的记录的主键值。然后,模块中的其他方法将使用此实例变量。
包含()回调的模块也不适合该任务,因为在该上下文中,self是模块而不是AR记录。
应如何处理?
由于
答案 0 :(得分:4)
在ActiveRecord上覆盖初始化程序可能会产生奇怪的副作用,这些副作用很难调试,因此不建议这样做。建议的方法是使用ActiveRecord提供的:after_initialize回调。您仍然可以通过模块混合此行为......
module MyCleverMixin
def after_initialize
puts "I'm Initializing!"
end
end
class MyModel < ActiveRecord
include MyCleverMixin
end
答案 1 :(得分:0)
如果您将initialize定义为:
def initialize(*atts)
super(*atts)
puts self.bullet_id
end
然后我认为它会做你想要的,因为它会首先使用ActiveRecord初始化为你正确设置对象。但是,我不确定这种方法对于你想要实现的目标有多强大。在访问它时,而不是在初始化对象时,创建此实例变量可能更合适。
在不知道你想要实例变量做什么的情况下,很难说。