3

我有这个:

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

和这个

module StagedVersionMethods     
  def initialize
    puts self.bullet_id
  end
end

当我创建 Bullet 实例时,模块初始化方法会触发,但出现 ActiveRecord 错误:...activerecord-2.2.2/lib/active_record/attribute_methods.rb:268:in `read_attribute'

我的意图是初始化一个实例变量,我需要我要混入的记录的主键值。然后模块中的其他方法将使用此实例变量。

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

应该如何处理?

谢谢

4

2 回答 2

4

覆盖 ActiveRecord 上的初始化程序可能会产生奇怪的副作用,证明难以调试,因此不建议这样做。推荐的方法是使用 ActiveRecord 提供的 :after_initialize 回调。您仍然可以通过模块混合这种行为......

module MyCleverMixin  

  def after_initialize
    puts "I'm Initializing!"
  end

end


class MyModel < ActiveRecord

  include MyCleverMixin

end
于 2009-06-15T16:50:40.053 回答
0

如果你定义初始化像:

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

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

在不知道您希望实例变量做什么的情况下很难说。

于 2009-06-15T16:36:50.357 回答