read
How to get collection of models inside your application. Certainly there are many ways to do it.
Lets have a look at different ways starting from worst -
Get table names inside database and then iterating over to get model name
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>@models = ActiveRecord :: Base . connection . tables . collect { | t | t . underscore . singularize . camelize }
</div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'>#=> ["AdhearsionAudit", "AudioLog", "AuditDetail","TinyPrint", "TinyVideo", "UnknownCall", "UserAudit", "User"] </div></div></pre></div>
Select those with associated class
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>@models . delete_if { | m | m . constantize rescue true } </div></div></pre></div>
Load models dir
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>@models = Dir [ 'app/models/*.rb' ]. map { | f | File . basename ( f , '.*' ) . camelize . constantize . name } </div></div></pre></div>
Select ActiveRecord::Base extended class only
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>@models . reject! { | m | m . constantize . superclass != ActiveRecord :: Base } </div></div></pre></div>
Get Active Record subclasses
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'># make sure relevant models are loaded otherwise
</div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'># require them prior
</div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'># Dir.glob(RAILS_ROOT + '/app/models/*.rb').each { |file| require file }
</div></div><div data-line='4' class='code-highlight-row numbered'><div class='code-highlight-line'>class A < ActiveRecord :: Base
</div></div><div data-line='5' class='code-highlight-row numbered'><div class='code-highlight-line'>end
</div></div><div data-line='6' class='code-highlight-row numbered'><div class='code-highlight-line'>class B < A
</div></div><div data-line='7' class='code-highlight-row numbered'><div class='code-highlight-line'>end
</div></div><div data-line='8' class='code-highlight-row numbered'><div class='code-highlight-line'>ActiveRecord :: Base . send ( :subclasses ) . collect ( & :name )
</div></div><div data-line='9' class='code-highlight-row numbered'><div class='code-highlight-line'>#=> […., A] </div></div></pre></div>
How to get Inherited models too
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>class A < ActiveRecord :: Base
</div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'>end
</div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'>class B < A
</div></div><div data-line='4' class='code-highlight-row numbered'><div class='code-highlight-line'>end
</div></div><div data-line='5' class='code-highlight-row numbered'><div class='code-highlight-line'>ActiveRecord :: Base . descendants . collect ( & :name )
</div></div><div data-line='6' class='code-highlight-row numbered'><div class='code-highlight-line'>#=> […., A, B] </div></div></pre></div>
Below is more elegant solution provide by Vincent-robert over stack overflow which recursively looks for subsequent descendent’s of class and gives you list from all over application
<div class='code-highlight'><pre class='code-highlight-pre'><div data-line='1' class='code-highlight-row numbered'><div class='code-highlight-line'>class Class
</div></div><div data-line='2' class='code-highlight-row numbered'><div class='code-highlight-line'> def extend? ( klass )
</div></div><div data-line='3' class='code-highlight-row numbered'><div class='code-highlight-line'> not superclass . nil? and ( superclass == klass or superclass . extend? klass )
</div></div><div data-line='4' class='code-highlight-row numbered'><div class='code-highlight-line'> end
</div></div><div data-line='5' class='code-highlight-row numbered'><div class='code-highlight-line'>end
</div></div><div data-line='6' class='code-highlight-row numbered'><div class='code-highlight-line'> </div></div><div data-line='7' class='code-highlight-row numbered'><div class='code-highlight-line'>def models
</div></div><div data-line='8' class='code-highlight-row numbered'><div class='code-highlight-line'> Module . constants . select do | constant_name |
</div></div><div data-line='9' class='code-highlight-row numbered'><div class='code-highlight-line'> constant = eval constant_name
</div></div><div data-line='10' class='code-highlight-row numbered'><div class='code-highlight-line'> if not constant . nil? and constant . is_a? Class and constant . extend? ActiveRecord :: Base
</div></div><div data-line='11' class='code-highlight-row numbered'><div class='code-highlight-line'> constant
</div></div><div data-line='12' class='code-highlight-row numbered'><div class='code-highlight-line'> end
</div></div><div data-line='13' class='code-highlight-row numbered'><div class='code-highlight-line'> end
</div></div><div data-line='14' class='code-highlight-row numbered'><div class='code-highlight-line'>end </div></div></pre></div>