初始化混合到模型中的模块

时间:2009-06-15 16:06:41

标签: ruby-on-rails activerecord module mixins

我有这个:

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记录。

应如何处理?

由于

2 个答案:

答案 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初始化为你正确设置对象。但是,我不确定这种方法对于你想要实现的目标有多强大。在访问它时,而不是在初始化对象时,创建此实例变量可能更合适。

在不知道你想要实例变量做什么的情况下,很难说。