2011-01-12 18 views
1

私はプラグインを作成しています。このプラグインでは、プラグイン内で新しいリレーションを動的に定義しています。サンプルコードはインスタンス変数に保存されたモデルの属性を取得する方法

class Person < AtiveRecord::Base 
    attach_documents_as :financial_documents 
end 

は今、この

def initialize(*args) 
    super(*args) 
    "#{@as}".build 
end 
のようにオーバーロードされたinitializeメソッドでクラスのこの属性にアクセスしたいアクセスしたいと私はそれを使用するすべてのモデルになりました

module AttachDocumentsAs 
    @as = nil 
    def attach_documents_as(*attachment_as) 
     attachment_as = attachment_as.to_a.flatten.compact.map(&:to_sym) 
     @as   = attachment_as.first 
     class_inheritable_reader(@as) 

     class_eval do 
      has_many @as, :as => :attachable, :class_name=>"AttachDocuments::Models::AttachedDocument" 
      accepts_nested_attributes_for @as 
     end 
    end 
end 

以下に示します。

しかし、それは必要な属性を取得していない、誰も私にそれを助けることができます。私はこの関係を構築し、いくつかの初期値を設定したいと思います。

皆さんからのガイドラインを待っています。

答えて

0

@asクラスインスタンス変数(Personのクラスメソッドでのみ使用可能)と@asインスタンス変数(このクラスのインスタンスでのみ使用可能)を混乱させる可能性があります。その説明が少し複雑に聞こえても、私は知っています。

各オブジェクトにはインスタンス変数があり、クラスは単なるオブジェクトのタイプです。このクラスのインスタンスもオブジェクトであり、独自のインスタンス変数を持ちます。クラスのインスタンスからクラスインスタンス変数を取得するには、定義したようなリーダーメソッドが必要です。たぶん、あなたは何を意味するかです:

def initialize(*args) 
    super(*args) 

    # self.class.as returns something like :financial_documents, so use this method 
    # to return a scope to build in. 
    send(self.class.as).build 
end 

@as使用している方法は、あなたが${$as}とかもしれないようにそれを解除参照することができるPHPやPerlのようなものに慣れている示唆しています。 Rubyでは、通常、文字列またはシンボルからクラスまたはメソッドのいずれかに参照解除されます。

シンボルをメソッド呼び出しに変換しようとしているようですが、これはsendで終了します。

文字列をクラスに変換しようとしていた場合は、Rails環境の機能である文字列のconstantizeメソッドを使用します。

+0

私は class_inheritable_reader(@As) class_inheritable_reader使用(:atd_as) write_inheritable_attributeを(:atd_as、@As)今の内側 とは、私は self.send(self.send(とそれを得ることができます初期化:atd_as)) しかし、問題はビルドを呼び出すことです。 self.send(self.send(:atd_as))ビルド は動作しません。 –

関連する問題