3

私はこれを持っています:

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

この

module StagedVersionMethods     
  def initialize
    puts self.bullet_id
  end
end

Bullet のインスタンスを作成すると、モジュールの initialize メソッドが起動しますが、ActiveRecord エラーが発生します: ...activerecord-2.2.2/lib/active_record/attribute_methods.rb:268:in `read_attribute'

私の意図は、混合先のレコードの主キー値が必要なインスタンス変数を初期化することです。モジュール内の他のメソッドは、このインスタンス変数で動作します。

module included() コールバックもタスクに適合しません。そのコンテキストでは、self は AR レコードではなく Module であるためです。

これにはどのようにアプローチする必要がありますか?

ありがとう

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 に答える