I am trying to create a generic person model. Then subclass it as either a professor or an author. The only problem is that since some professors are authors, I don't want duplicate entries. Any ideas on how to handle this?
on 2007-02-06 08:27
on 2007-02-06 16:08
I wouldn't use a polymorphic model for this, I would use single table inheritance. Have a single table People with a type column, then have a model Person and subclasses for each type so: class Person < ActiveRecord::Base end class Professor < Person end class Author < Person end
on 2007-02-06 16:31
I just went back and re-read your original post, single table won't work either since you have the possibility of a person having two types. The solution is going to be a little more complex as you will need to create a many to many relationship. I would use 3 tables: create_table :people do |t| t.column :id, :integer t.column :name, :string end create_table :person_roles do |t| t.column :id, :integer t.column :person_id, :integer t.column :role_id, :integer end create_table :people do |t| t.column :id, :integer t.column :role, :string end "People" would house the information about the person, "Roles" would be a domain of roles a person could play (Author, professor, student), and "Person_Roles" would allow the many to many. You would then have: class Person < ActiveRecord::Base has_many :roles, :through => :person_roles has_many :person_roles end Hope that helps, sorry for my hasty first post! Joe
on 2007-02-06 16:34
I should know never to post prior to my morning caffeine intake... There is a typo on the third table definition: > create_table :people do |t| > t.column :id, :integer > t.column :role, :string > end Should be: create_table :roles do |t| t.column :id, :integer t.column :role, :string end