РЕДАКТИРОВАТЬ: Посмотрите на комментарии и другие ответы. Есть более умные ответы, чем этот! Или попробуйте улучшить его как вики сообщества.
Модели не регистрируются в главном объекте, поэтому нет, у Rails нет списка моделей.
Но вы все равно можете посмотреть содержимое каталога моделей вашего приложения ...
Dir.foreach("#{RAILS_ROOT}/app/models") do |model_path|
# ...
end
РЕДАКТИРОВАТЬ: Другая (дикая) идея будет использовать отражение Ruby для поиска всех классов, которые расширяют ActiveRecord :: Base. Не знаю, как вы можете перечислить все классы, хотя ...
РЕДАКТИРОВАТЬ: Просто для удовольствия, я нашел способ перечислить все классы
Module.constants.select { |c| (eval c).is_a? Class }
РЕДАКТИРОВАТЬ: наконец удалось перечислить все модели, не глядя на каталоги
Module.constants.select do |constant_name|
constant = eval constant_name
if not constant.nil? and constant.is_a? Class and constant.superclass == ActiveRecord::Base
constant
end
end
Если вы хотите обрабатывать и производный класс, вам нужно будет протестировать всю цепочку суперкласса. Я сделал это, добавив метод в класс Class:
class Class
def extend?(klass)
not superclass.nil? and ( superclass == klass or superclass.extend? klass )
end
end
def models
Module.constants.select do |constant_name|
constant = eval constant_name
if not constant.nil? and constant.is_a? Class and constant.extend? ActiveRecord::Base
constant
end
end
end