2010-02-06 68 views
1

我有許多使用標準導軌模型生成器創建的模型。 一些模型然後得到了一個名爲foo()的方法。獲取所有已實施某種方法的模型

是否有一種簡單的方法可以找出生成的模型的所有類名,並實現了foo()方法?

我的意思是從軌道控制器programmaticaly,而不是從控制檯grepping源代碼。

回答

2

Rails不會保留模型的索引,因此您只需走動您的app/models目錄。

下面是一個例子:

# Open the model directory 
models_dir = Dir.open("#{RAILS_ROOT}/app/models") 

# Walk directory entries 
models = models_dir.collect do |filename| 
    # Get the name without extension. 
    # (And skip anything that isn't a Ruby file.) 
    next if not filename =~ /^(.+)\.rb$/ 
    basename = $~[1] 

    # Now, get the model class 
    klass = basename.camelize.constantize 

    # And return it, if it implements our method 
    klass if klass.method_defined? :foo 
end 

# Remove nils 
models.compact! 

Rails的加載你的模型和控制器懶洋洋地,被引用的第一次。這是通過使用Ruby的const_missing方法完成的,您可以在active_support/dependencies.rb中看到ActiveSupport中發生的所有魔法。

爲了詳細介紹一下上面發生的事情,您還需要知道類名和文件名是鏈接的。 Rails預計ThingyBob模型將在thingy_bob.rb中生存。這兩個名稱之間的轉換方式是使用String方法camelize。 (反過來是underscore方法。)這些字符串擴展也是ActiveSupport的一部分。

最後,使用ActiveSupport方法constantize(也是字符串擴展名),我們將字符串解引用爲常量。所以基本上"ThingyBob".constantize與剛纔寫的ThingyBob一樣;我們只需要返回ThingyBob。在上面的例子中,constantize也觸發了常規的依賴加載魔術。

希望能幫助揭開一些事情的神祕面紗。 :)

+0

謝謝,現在一切都清楚:) – astropanic 2010-02-06 17:20:48

相關問題