3

Is there a way to detect all the models used in a Rails app that have database tables? I've tried to detect all models in a Rails application by reading all the models off of the app/models directory and simply read all the files in that directory. However, I do not think this is the best approach and have spent a considerable amount of time researching this but I haven't gotten a better answer yet. Can anyone help me with this. Many thanks!

RubyFanatic
  • 2,241
  • 3
  • 22
  • 35
  • 1
    Duplicate? http://stackoverflow.com/questions/516579/is-there-a-way-to-get-a-collection-of-all-the-models-in-your-rails-app – Doon Mar 08 '11 at 18:58
  • Thanks Doon. I've tried this method before and I was wondering if there is a better method. – RubyFanatic Mar 08 '11 at 19:07

2 Answers2

4

I'm assuming you are using ActiveRecord. If you are, here is how you go about getting a list of all ActiveRecord::Base subclasses:

ActiveRecord::Base.subclasses

You can also do the following:

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

dbmodels should now contain all your ActiveRecord::Base models.

Keep in mind that in your development environment you won't get a full list of subclasses unless they have been loaded/used, so I would recommend performing this in your production environment instead, that way you can ensure that all your models have been loaded.

Pan Thomakos
  • 34,082
  • 9
  • 88
  • 85
0

You first need to make sure that all the models are loaded:

Rails.application.eager_load!

In Rails 3, the ideal way to find all ActiveRecord descendants is with descendants:

ActiveRecord::Base.descendants

Then, select those with a table:

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

The basis for this was pulled from https://stackoverflow.com/a/10712838/15585.

Community
  • 1
  • 1
deterb
  • 3,994
  • 1
  • 28
  • 33