2009-06-15 83 views
1

一个模块我有这样的:初始化混合的模式

class Bullet < ActiveRecord::Base 
    include StagedVersionMethods 
    ... 
end 

module StagedVersionMethods  
    def initialize 
    puts self.bullet_id 
    end 
end 

当我创建子弹的实例,该模块初始化方法火灾,但我得到一个ActiveRecord错误: ...的ActiveRecord-2.2.2/lib目录/ active_record/attribute_methods.rb:268:在`read_attribute”

我的意图是初始化,我需要的初步实例变量我正在混合的记录的关键值。然后模块中的其他方法将使用这个实例变量。

模块包含()回调不适合任务,因为在这种情况下,self是模块而不是AR记录。

应该如何接近?

感谢

回答

0

如果定义了初始化,如:

def initialize(*atts) 
    super(*atts) 
    puts self.bullet_id 
end 

那么我认为这会做你想做的,因为它会正确地设置对象首先使用ActiveRecord的初始化。但是,我不确定这种方法对于您想要实现的功能有多强大。在访问它时创建此实例变量可能更合适,而不是在初始化对象时。

不知道你想要实例变量做什么,这很难说。

+0

谢谢沙德韦尔 实例变量将是实例“自我”的副本,但它所做的编辑。它代表“父母”项目符号的临时副本,并且该模块将在方法中混入MOdel - has_temp_version,apply_temp_version,discard_temp_version等方法。 我尝试了你建议的方法(这非常合理),但是包括bullet_id在内的自我属性都是零。 我现在正在使用你的第二个建议,这工作正常 - 只比我想要的多一点管道。 干杯 – Paul 2009-06-15 16:54:02

4

在ActiveRecord上覆盖初始化器可能会产生奇怪的副作用,难以调试,因此不推荐使用。推荐的方法是使用:ActiveRecord提供的after_initialize回调。您可以在通过一个模块还是混合这种行为......

module MyCleverMixin 

    def after_initialize 
    puts "I'm Initializing!" 
    end 

end 


class MyModel < ActiveRecord 

    include MyCleverMixin 

end 
+0

谢谢。事情是,我期待克拉斯是我的模型混合模块,但克拉斯类是“班”,块永远不会被调用。我得到棒的错误结局? 非常感谢。 – Paul 2009-06-15 19:29:29