Есть ли способ получить коллекцию всех моделей в вашем приложении Rails? - PullRequest
187 голосов
/ 05 февраля 2009

Есть ли способ, которым вы можете получить коллекцию всех Моделей в вашем приложении Rails?

В основном, я могу сделать что-то вроде: -

Models.each do |model|
  puts model.class.name
end

Ответы [ 27 ]

9 голосов
/ 16 апреля 2012

ActiveRecord::Base.connection.tables

7 голосов
/ 19 июля 2012

В одну строку:

 ActiveRecord::Base.subclasses.map(&:name)
6 голосов
/ 13 ноября 2013

Я пока не могу комментировать, но думаю, что sj26 answer должно быть лучшим ответом. Просто намек:

Rails.application.eager_load! unless Rails.configuration.cache_classes
ActiveRecord::Base.descendants
4 голосов
/ 28 апреля 2017

Да, есть много способов найти все названия моделей, но то, что я сделал в моем драгоценном камне model_info , это даст вам все модели, даже включенные в драгоценные камни.

array=[], @model_array=[]
Rails.application.eager_load!
array=ActiveRecord::Base.descendants.collect{|x| x.to_s if x.table_exists?}.compact
array.each do |x|
  if  x.split('::').last.split('_').first != "HABTM"
    @model_array.push(x)
  end
  @model_array.delete('ActiveRecord::SchemaMigration')
end

, затем просто напечатайте это

@model_array
3 голосов
/ 27 июля 2014

Это работает для Rails 3.2.18

Rails.application.eager_load!

def all_models
  models = Dir["#{Rails.root}/app/models/**/*.rb"].map do |m|
    m.chomp('.rb').camelize.split("::").last
  end
end
3 голосов
/ 28 марта 2017

Чтобы избежать предварительной загрузки всех Rails, вы можете сделать это:

Dir.glob("#{Rails.root}/app/models/**/*.rb").each {|f| require_dependency(f) }

require_dependency (f) - это то же самое, что Rails.application.eager_load!. Это должно избежать уже требуемых ошибок файла.

Тогда вы можете использовать все виды решений для перечисления моделей AR, например ActiveRecord::Base.descendants

2 голосов
/ 27 марта 2012
Module.constants.select { |c| (eval c).is_a?(Class) && (eval c) < ActiveRecord::Base }
1 голос
/ 14 ноября 2013

Это сработало для меня. Отдельное спасибо всем постам выше. Это должно вернуть коллекцию всех ваших моделей.

models = []

Dir.glob("#{Rails.root}/app/models/**/*.rb") do |model_path|
  temp = model_path.split(/\/models\//)
  models.push temp.last.gsub(/\.rb$/, '').camelize.constantize rescue nil
end
1 голос
/ 23 октября 2013

Только что наткнулся на эту, так как мне нужно напечатать все модели с их атрибутами (построено на комментарии @ Aditya Sanghi):

ActiveRecord::Base.connection.tables.map{|x|x.classify.safe_constantize}.compact.each{ |model| print "\n\n"+model.name; model.new.attributes.each{|a,b| print "\n#{a}"}}
1 голос
/ 10 июня 2013

Вот решение, которое было проверено со сложным приложением Rails (один квадратный)

def all_models
  # must eager load all the classes...
  Dir.glob("#{RAILS_ROOT}/app/models/**/*.rb") do |model_path|
    begin
      require model_path
    rescue
      # ignore
    end
  end
  # simply return them
  ActiveRecord::Base.send(:subclasses)
end

Он берет лучшие части ответов в этой теме и объединяет их в самое простое и полное решение. Это обрабатывает случаи, когда ваши модели находятся в подкаталогах, используют set_table_name и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...