2009-08-05 8 views

答えて

22

をRailsはdoesnのので、それが必要な場合以外はクラスをロードしないでください。フォルダからモデルを読み込む必要があります。 Railsの3

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

このコードは、既に必要だったモデルファイルを再要求するときに警告が表示されることがあるという点を除いて、私にとっては役に立ちます。私はexpand_pathを使ってこれを解決できました。http://devblog.avdi.org/2009/10/22/double-load-guards-in-ruby/ – DSimon

+2

の一番下をご覧ください、RAILS_ROOTがRails.rootに変更されました – Rubyrider

21

ですここでの答えの組み合わせは、疲れていた。

ので、ここでのRails

#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 
+4

ActiveRecord :: Base.subclassesは非推奨です。#descendantsを使用してください – jvatic

6

私は、すべてのRalisモデルを表示する方法を答えるグーグルた:ここではあなたが@modelsを交換したいコードレール3で

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

について

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

https://gist.github.com/1347687 – equivalent8

+0

使用例https://github.com/equivalent/my_rails_monkeypatch_bunch/ blob/master/automatic_guid_generator/lib/tasks/guid.rake – equivalent8

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

にも、STIテーブルのために働くのソリューションの組み合わせは、あなたのフォームActiveRecord::Baseを継承するか、既存のモデルのサブクラスのいずれか、すべてのモデル名を与えています。

+2

これはモデルの完全なリストではありません – bmalets

関連する問題