2009-08-05 3 views

ответ

22

Поскольку Rails Безразлично 't загружать классы, если они им не нужны, вы должны прочитать модели из папки. Вот код

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

+2

Небольшая коррекция, которую вы не против , RAILS_ROOT был изменен на Rails.root – Rubyrider

21

в рельсах 3 вы бы поменять местами @models для:

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

ActiveRecord :: Base.subclasses устарел, используйте #descendants – jvatic

6

для Rails 3

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

Я был ответ, как прибегая к помощи, чтобы показать все модели Ralis, сочетание ответов здесь было утомительным, THX.

так вот сочетание решений, которое работает даже для таблиц STI на 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 
+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) 

дает все модели имена, которые либо наследуют форму ActiveRecord::Base или подкласс любой существующей модели.

+2

Он не дает полного списка моделей – bmalets

Смежные вопросы