2012-02-26 48 views
1

鑑於以下ActiveRecord的模型:只列出的ActiveRecord子類的方法

class User < ActiveRecord::Base 
    has_many :games 
    def name 
    "Joe" 
    end 

    def city 
    "Chicago" 
    end 
end 

我想找回我直接添加到用戶類中的方法列表(而不是那些通過擴展ActiveRecord的添加和/或添加關聯)。示例輸出:

["name","city"] 

調用User.instance_methods(假)返回方法,通過添加的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"] 

隨着任何模型從數據庫列屬性。我想排除這些,只獲取子類上的自定義方法。

我的目的是方法跟蹤:我想跟蹤我的自定義方法,同時排除由ActiveRecord添加的方法。

任何想法?

+0

什麼版本的軌道您使用的作品? – 2012-02-26 21:50:55

+0

我正在測試w/Rails 2.2.2,但我願意接受更新版本的解決方案。 – 2012-02-26 22:21:59

+0

在rails 3.2中,屬性訪問器,關聯訪問器和可能的驗證內容是在你的模型中包含的方法中定義的,這使得你試圖做的更容易 – 2012-02-27 07:28:45

回答

0

使用method_added掛鉤將方法名稱添加到列表中,並使用Monkey修補程序Active Record,以便AR添加的方法不會添加到該列表中。

如果您不想破解AR打開並開始四處探查,您還可以定義一個「類宏」,它定義了一個方法將它添加到列表中。對於您自己的自定義方法,請使用類宏而不是def

如果你不熟悉的東西我指的是作爲「階級宏」,它只是一個像這樣的方法:

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

使用類似mydef定義方法,而不是def絕對是醜陋,但它會解決問題,而不需要任何猴子修補。

+0

爲了澄清,「類宏」是一個實例方法在'Class'上,你可以從'class'塊中調用以定義方法等'attr_accessor'是另一個例子。 – 2012-02-26 21:58:13

+0

方法的參數呢? – megas 2012-02-26 22:03:08

+0

如果傳遞給'define_method'的塊帶有參數,則生成的方法也將帶有參數。 – 2012-02-26 22:04:25

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] 

這一個測試,它

+0

這不起作用,因爲由AR自動生成的方法(例如用於數據庫列的方法)不會在'ActiveRecord :: Base.instance_methods'中。 – 2012-02-26 22:12:18

+0

是的 - 這返回ActiveRecord添加到User類的方法。例如,你會看到類似':games ='的輸出,這是我不想要的,但是因爲'有許多:遊戲'關聯而被包括在內。 – 2012-02-26 22:27:54

+0

更新後,請參閱最新版本 – megas 2012-02-26 22:36:25

相關問題