Чтение всех моделей в приложении Rails

Есть ли способ обнаружить все модели, используемые в приложении Rails, которые имеют таблицы базы данных? Я попытался обнаружить все модели в приложении Rails, прочитав все модели из каталога приложений/моделей и просто прочитав все файлы в этом каталоге. Тем не менее, я не думаю, что это лучший подход и потратил немало времени на изучение этого, но я пока не получил лучшего ответа. Кто-нибудь может мне с этим помочь. Большое спасибо!

Ответ 1

Я предполагаю, что вы используете ActiveRecord. Если да, вот как вы собираетесь получить список всех подклассов ActiveRecord:: Base:

ActiveRecord::Base.subclasses

Вы также можете сделать следующее:

dbmodels = []
ObjectSpace.each_object(Module){ |m| dbmodels << m if m.ancestors.include?(ActiveRecord::Base) && m != ActiveRecord::Base }

dbmodels теперь должен содержать все ваши ActiveRecord:: Base.

Имейте в виду, что в вашей среде разработки вы не получите полный список подклассов, если они не были загружены/использованы, поэтому я бы рекомендовал выполнить это в вашей производственной среде, таким образом вы можете обеспечить, чтобы все ваши модели были загружены.

Ответ 2

Сначала вам нужно убедиться, что все модели загружены:

Rails.application.eager_load!

В Rails 3 идеальный способ найти всех потомков ActiveRecord с помощью descendants:

ActiveRecord::Base.descendants

Затем выберите те, у которых есть таблица:

ActiveRecord::Base.descendants.select(&:table_name)

Основа для этого была взята из fooobar.com/info/36993/....