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>

Blog Logo

Sandip Ransing


Published

Image

Fun On Rails

Journal of a Web Developer #ruby #rails #JS

Back to Overview