2009-08-05 43 views
17

我需要一個包含所有型號(class_names)的列表,其末尾具有「Cube」模式。獲取所有型號的列表

例如:

我所有的車型: ModelFoo,ModelBar,ModelBarCube,Mode2BarCube

我需要什麼:

[ 'ModelBarCube', 'Mode2BarCube']

回答

22

由於Rails的沒有按除非需要它們才加載類,您必須從文件夾中讀取模型。下面是代碼

Dir.glob(Rails.root + '/app/models/*.rb').each { |file| require file } 
    @models = Object.subclasses_of(ActiveRecord::Base).select { |model| 
    model.name[-4..-1] == "Cube" 
    } 
+1

此代碼適用於我,但有時會在我需要之前已經需要的模型文件時收到警告。我能夠通過使用expand_path來解決此問題,請參閱http://devblog.avdi.org/2009/10/22/double-load-guards-in-ruby/ – DSimon 2012-06-14 20:09:31

+2

的底部稍微更正一下,希望您不要介意,RAILS_ROOT已更改爲Rails.root – Rubyrider 2013-04-30 11:25:30

21
在軌道3

你交換@models爲:

@models = ActiveRecord::Base.subclasses.collect { |type| type.name }.sort 
+4

ActiveRecord :: Base.subclasses已棄用,請使用#descendants – jvatic 2011-07-27 21:38:04

6

對於Rails 3的

@models = ActiveRecord::Base. 
    descendants. 
    select{|x| x.name[-4..-1] == "Cube"} 
3

我在谷歌上搜索答案如何顯示所有Ralis車型,這裏的答案組合很疲憊,thx。

所以這裏是解決方案的組合on Rails的甚至STI表工作

#Since Rails doesn't load classes unless it needs them, you must read the models from the folder. Here is the code 
Dir[Rails.root.to_s + '/app/models/**/*.rb'].each do |file| 
    begin 
    require file 
    rescue 
    end 
end 

models = ActiveRecord::Base.subclasses.collect { |type| type.name }.sort 

models.each do |model| 
    print model 
    print ' ' 
end 
+0

https://gist.github.com/1347687 – equivalent8 2011-11-08 13:03:36

+0

使用示例https://github.com/equivalent/my_rails_monkeypatch_bunch/ blob/master/automatic_guid_generator/lib/tasks/guid.rake – equivalent8 2011-11-08 15:16:27

6
@models = ActiveRecord::Base.descendants.map(&:name) 

賦予您無論是繼承形式ActiveRecord::Base所有型號名稱或者是任何現有模型的子類。

+2

它沒有提供完整的模型列表 – bmalets 2014-09-14 18:43:08