2011-12-06 4 views
0

これは私のコードです:上記のコード実行後ActiveRecord AssociationCollectionオブジェクトで委譲されるメソッド呼び出しの下の原則は何ですか?

class Company < ActiveRecord::Base 
    has_many :employees 
end 

my_company = Company.first 
employees = my_company.employees 
puts employees.class 
puts employees.methods.include? "create" 
puts employees.respond_to? :create 

出力:

Array 
false 
true 

私は空のメソッド本体と「employees.method_mising」を上書きしても、作成方法がまだ存在します正常に実行されます。私はactiverecordが "employees"オブジェクトに "create"メソッドを追加する方法を知りたい。 Rubyデバッガでは、 "create"メソッドが "ActiveRecord :: Associations :: AssociationCollection"クラスに追加されている可能性があり、ソースコードを読み込もうとしましたが、複雑すぎます。下の原則。だから、原理を知っている人がいるはずですよね?あなたは私にそれについて教えていただけますか?

答えて

0

active_recordのソースコードを読んだ後、私は、 "従業員" varがクラスのインスタンスであることがわかった "のActiveRecord ::協会:: HasManyAssociation"(< "のActiveRecord ::協会:: AssociationCollection" <「のActiveRecord ::協会:: AssociationProxy ")実際には。実際に、彼らは、このコード行を追加してAssociationProxyのほぼすべての方法(「方法」、「クラス」などが含まれる)UNDEF:

 instance_methods.each { |m| undef_method m unless m.to_s =~ /^(?:nil\?|send|object_id|to_a)$|^__|^respond_to_missing|proxy_/ } 

、彼らは(私の場合、それはインスタンスのターゲットオブジェクトを使用します)は、 "undef"メソッドを委譲し、 "respond_to?"などのメソッドは "create/build"メソッドを持つ "proxy"オブジェクトに委譲されます。 "employees.respond_to?:create"はtrueを返しますしかし、 "employees.methods"を呼び出す呼び出しによって返されたメソッドリストには、 "create"メソッドが含まれていません。