Skip to content
This repository

A plugin to make class table inheritance in Active Record.

branch: master

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 lib
Octocat-spinner-32 test
Octocat-spinner-32 .gitignore
Octocat-spinner-32 Gemfile
Octocat-spinner-32 README.markdown
Octocat-spinner-32 Rakefile
Octocat-spinner-32 class-table-inheritance.gemspec
Octocat-spinner-32 init.rb
README.markdown

Change log

  • Now you can inherits from and to modules like inherits_from 'Module::Model', see the the name of field must be module_model_id:integer thanks for Marc Remolt (https://github.com/mremolt).
  • Unit test

Note about version

If you are using Rails 2.3.8 or other version < 3, you have to use the version 1.1.x of this plugin, for Rails 3 you need to use the version 1.2.x or master of this plugin.

ClassTableInheritance 1.3.0

This is an ActiveRecord plugin designed to allow simple multiple table (class) inheritance.

This plugin was inspired by: inherits_from plugin => http://github.com/rwl4/inherits_from and Multiple Table Inheritance with ActiveRecord => http://mediumexposure.com/multiple-table-inheritance-active-record/

How to install

gem install class-table-inheritance

Example

Migrations

  create_table :products do |t|
    t.string :description, :null => false
    t.string :subtype # Only if you need access of both side see example
    t.decimal :price
    t.timestamps
  end

  create_table :books, :inherits => :product do |t|
    t.string :author, :null => false
  end

  create_table :videos, :inherits => :product do |t|
    t.string :year, :null => false
    t.string :genre, :null => false
  end

Models

  class Product < ActiveRecord::Base
    acts_as_superclass # only if you want top-down access.
  end

  class Book < ActiveRecord::Base
    inherits_from :product
  end

  class Video < ActiveRecord::Base
    inherits_from :product
  end

  book = Book.find(1)
  book.name => "Agile Development with Rails"
  book.author => "Dave Thomas"
  book.price => 19.00

  video = Video.find(2)
  video.name => "Inseption"
  video.year => "2010"
  video.genre => "SCI-FI" 
  video.price => 22.00

  book = Book.new
  book.name = "Hamlet"
  book.author = "Shakespeare, William"
  book.price => 14.00
  book.save

Module inheritance

Migrations

create_table :mod_users do |t|
  t.string :name, :null => false
end  

create_table :managers, :inherits => 'Mod::User' do |t|
  t.string :salary, :null => false
end

Models

class Mod::User < ActiveRecord::Base
end  

class Manager < ActiveRecord::Base
  inherits_from 'Mod::User'  
end

Top-down access (Polymorphic)

if you want to access product and get field in the subclass do you need to create a field subtype:string in superclass and ad acts_as_superclass in superclass and now you can do like this.

  product = Product.find 1  # This is a Book instance.
  product.author

  product = Product.find 2 # This is a Video instance.
  product.genre

if you need help contanct me: bfscordeiro (at) gmail.com .

Copyright (c) 2010 Bruno Cordeiro, released under the MIT license

Something went wrong with that request. Please try again.