ruby-on-railsclass-table-inheritance

How do I implement class-table-inheritance in Rails?


I just finished working my way through the book Agile Web Development with Rails, fourth edition (http://pragprog.com/book/rails4/agile-web-development-with-rails), and need some help in understanding how to create a parent-child relationship between models. I did some Googling and poked around here on StackOverflow and learned generally about single table inheritance and class table inheritance.

I have a bunch of metadata about different items in an archival collection. Much of the metadata is the same for all objects, e.g., accession number, title, description, copyright, etc. In addition to the common metadata, there is metadata that is only applicable to certain types of items, e.g., photos need to keep track of whether the item is in color or black and white; sound recordings need to keep track of the format (CD, DAT, cassette tape, etc.) and duration; text materials need to keep track of the number of pages; etc.

       Class hierarchy

            Item
              |
  +-----------+------------+
  |           |            |
Photo   SoundRecording    Text

Since I will have many thousands of records I have ruled out single table inheritance as being too inefficient. I understand the idea of class table inheritance as presented here: http://martinfowler.com/eaaCatalog/classTableInheritance.html but am confused on how I would actually implement this in a new Ruby on Rails project. Do I implement class table inheritance as a polymorphic association (http://guides.rubyonrails.org/association_basics.html#polymorphic-associations) or am I on the wrong track?

Thank you.


Solution

  • Yes. It boils down to this (in Rails 3)

    class Business < ActiveRecord::Base
      belongs_to  :biz, :polymorphic => true
    end
    
    class Restaurant < ActiveRecord::Base
      acts_as_biz
    end
    

    Here's a very good tutorial on how to do it.

    http://techspry.com/ruby_and_rails/multiple-table-inheritance-in-rails-3/