2012-02-26 12 views
1

関連付けを追加する)。出力例:すべてのモデルは、データベースの列から属性とともにリストのみActiveRecordのサブクラスのメソッド

["validate_associated_records_for_games", "games", "game_ids", "games=", "game_ids=", "after_create_or_update_associated_records_for_games", "before_save_associated_records_for_games"] 

["name","city"] 

呼び出すUser.instance_methods(偽)のActiveRecordによって追加されたメソッドを返します。私はそれらを除外し、サブクラスでカスタムメソッドを取得したいと思います。

私の目的はメソッドのトレースです。ActiveRecordで追加されたメソッドを除外してカスタムメソッドをトレースしたいと思います。

アイデア?

+0

動作しますか? –

+0

私はRails 2.2.2でテストしていますが、最近のバージョンのソリューションを公開しています。 –

+0

レール3.2では、属性アクセサ、アソシエーションアクセサ、多分バリデ​​ーションは、あなたのモデルに含まれているメソッドに定義されているため、あなたがやろうとしているものが簡単になります。 –

答えて

0

リストにメソッド名を追加するフック、およびARによって追加されたメソッドがそのリストに追加されないようにMonkeyパッチActive Recordを使用します。

ARを開けて突き止めたくない場合は、メソッドを定義する "クラスマクロ"を定義して、リストに追加することもできます。独自のカスタムメソッドの場合は、defではなくクラスマクロを使用してください。

あなたは、私が「クラスマクロ」と言及していますどのように慣れていない場合、それは単に、このようなメソッドです:

class Class 
    def mydef(name,&block) 
    (@methods || []) << name 
    define_method(name,&block) 
    end 
end 

メソッドを定義するmydefのようなものを使用したのではなくdefは間違いです醜いですが、猿のパッチを当てなくても問題は解決します。

+0

"クラスマクロ"はインスタンスですメソッドを定義する 'class'ブロックの中から呼び出すことができる' Class'のメソッドです。 'attr_accessor'は別の例です。 –

+0

メソッドの引数はどうですか? – megas

+0

'define_method'に渡されたブロックが引数を取る場合、生成されたメソッドも引数をとります。 –

1
User.instance_methods - ActiveRecord::Base.instance_methods #=> [:name,:city] 

UPDATE:

これらのメソッドの順序は

class User < ActiveRecord::Base 
    def self.my_own_methods 
    self.instance_methods - @@im 
    end 
    has_many :games 
    @@im = self.instance_methods 
    def name 
    "Joe" 
    end 
    def city 
    "Chicago" 
    end 
end 

User.my_own_methods #=> [:name, :city] 

この1重要なテストであり、それはあなたが使用しているレールのバージョン

+0

ARで自動的に生成されるメソッド(DBカラムなど)が 'ActiveRecord :: Base.instance_methods 'にないため、これは機能しません。 –

+0

うん - これは、ActiveRecordがUserクラスに追加するメソッドを返します。たとえば、 ':games ='のような出力が表示されますが、これは望ましくありませんが、 'have many:games'という関係のために含まれています。 –

+0

更新されました。新しいバージョン – megas

関連する問題