Search code examples
ruby-on-railssingle-table-inheritance

Class Inheritance or Single Table Inheritance in Rails 2.3


I have the following scenario and I'm not sure if I should use Class Inheritance or Single Table Inheritance:

Class User
  has_one :main_list
  has_one :known_list
  has_many :regular_lists
end

Class List
  has_many :words
end

Class Word
  belongs_to :list
end

What I would like to do is have each different list type be a different class, the problem is that if I do that, I would need to add main_list_id, known_list_id, and regular_list_id to the Word object/class. This seems cumbersome. Can I do something like:

Class MainList
  has_many :words, :foreign_key => list_id
end

and then something like:

@user.main_list.find_by_name("MainList") ?

The only problem with this is that someone could name a RegularList "MainList".


Solution

  • You could do something like this:

    Class User < ActiveRecord::Base
       has_many :lists
    end
    
    Class List < ActiveRecord::Base
      belongs_to :user
      has_and_belongs_to_many :words
    end
    
    Class Word < ActiveRecord::Base
      has_and_belongs_to_many :lists
    end
    

    On the list class you could add two boolean fields to list; one for main_list and the other for known_list. On that class you could also add validations to make sure that each user only has one main list and one known list. To select the main list for a user you could do:

    @user.lists.find(:first, :conditions => {:main_list => true})