Hi. I am currently developing a small course system for student and teachers. The system is divided in sections and sections have many messages, comments, documents and schedules. Pretty easy to set up using ROR, just add some belongs_to and has_many relations. But everything becomes much more complicated when the section items (message, comment and so on...) all has comments. And they can also be a favorite to a users favorite list and much more. Basically all the items has some shared generic stuff that I just don't want to copy around. Let's check my rest routes so everyone understands better: map.resources :sections do |sections| sections.resources :messages sections.resources :documents sections.resources :schedules end map.resources :items do |item| item.resources :comments item.resources :favorites end I would basically want to have a generic resource (Item) that takes care of comments, favorites and so on. And that is what my question is all about. Is it a good way to inherit from a base class called Items using STI? Or could I solve this problem some other way? If I don't have a base class I would have to nest the comment resources to each of the items and that's not a good solution either.
on 2009-05-12 11:13
on 2009-05-12 12:00
Hello, STI seems not suitable, I would call that abuse, unless you have almost everything common between yout different tables. But you can use o polymorphic relation for comment, and extract the common behaviour in a plugin (something like acts_as_commentable) Look here : hhttp:// guides.rails.info/association_basics.html#polymorphic-associations
on 2009-05-12 12:58
Yes, I was almost thinking that my self. Thanks for clarifying that. What I now is trying to do is to have a generic model called Item that relates to the different items through a itemable interface (belongs_to :itemable, polymorphic => true). And then the Item model belongs to the Section. What do you think of that?