How to implement Active Record inheritance in Ruby on Rails? How to implement Active Record inheritance in Ruby on Rails? database database

How to implement Active Record inheritance in Ruby on Rails?


Rails supports Single Table Inheritance.

From the AR docs:

Active Record allows inheritance by storing the name of the class in a column that by default is named "type" (can be changed by overwriting Base.inheritance_column). This means that an inheritance looking like this:

class Company < ActiveRecord::Base; end   class Firm < Company; end  class Client < Company; end   class PriorityClient < Client; end

When you do Firm.create(:name => "37signals"), this record will be saved in the companies table with type = "Firm". You can then fetch this row again using Company.find(:first, "name = ‘37signals’") and it will return a Firm object.

If you don‘t have a type column defined in your table, single-table inheritance won‘t be triggered. In that case, it‘ll work just like normal subclasses with no special magic for differentiating between them or reloading the right type with find.

A pretty good tutorial is here: http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/


Models:

class Animal < ActiveRecord::Base; endclass Dog < Animal; endclass Cat < Animal; end

Migration:

class CreateAnimals < ActiveRecord::Migration  def self.up    create_table :animals do |t|      # Other attributes...      t.string :type    end  end  def self.down    drop_table :animals  endend


ActiveRecord supports mapping inheritance hierarchies to a single table(Single-table inheritance. Table would have a column type which stores name of actual class and is used to select other class-specific columns.

It is possible to implement multi-table inheritance mapping, as shown here, but this particular way is not portable, AFAIK.