Michael Pavling wrote: > On 7 June 2010 20:42, Yanni Mac <li...@ruby-forum.com> wrote: >> class ShirtProduct < ActiveRecord::Base >> end >> >> class PantsProduct < ActiveRecord::Base >> end > > And have you *really* designed to have a different table for different > types of product? I can only imagine lots of pain that will be caused > by that further down the line. > > I'd suggest a look at polymorphism.
My original example is polymorphism using mixin modules/duck typing. Are you referring to STI? I read a while back that STI was a bad choice unless your fields are almost the same for every subclass. I am using sort of a hybrid form of STI as you can see in my current design below. Can you explain which implementation of polymorphism you were referring to? In my use case the fields can vary a good bit from type to type, and the types share about 20% of the fields with the parent class. I am more concerned about sharing methods than I am fields in these associations, but I do need to use a parent table to retrieve all records from every subclass, so I don't have to do a bunch of crazy joins. My real use case is as follows. If you have 5 minutes to read my lengthy use case, can you explain which design you would choose and why? USE CASE: I am rewriting some software I use to track affiliate network transactions and I am going to release it open source, so I want to make sure the design is sound. The original software was basically a quick hack written in a day to get some info in my tables. But as I expand my use of these tables I realize the limitations and I need something that is designed well and maintainable. An affiliate network = website that tracks clicks from a publisher website over to a merchant website and records if a purchase is made. The affiliate network then records transactions from the merchant website and makes them available to the publisher so they can see how much commission they earned from each sale. There are 8 major affiliate networks that I pull transactions from right now and in the next 5 years, maybe that will grow to 20 or 30... and maybe up to 100 if someone adds smaller networks to my open source branch. In the most basic form a transaction (which will be a single instance/database row of the class) includes a date, a sale amount, and a commission amount. Each network has a different way of representing this data and they all include additional fields that are different. I want to preserve the integrity of the original data from each network in my database in case I need it later on.. otherwise I would just manipulate the data when I pull it and insert it into one table with the common fields (date,sale,commission,network) and drop the rest of the data. I also need to get the transactions in various formats (csv,xml) from various sources using REST & SOAP, so each subclass (affiliate network) will have some custom functionality in grabbing the data. For these 2 reasons, I was planning on having a separate model and table for each subclass. So here is my current design. I created a mixin module called BaseTransaction for all the shared functionality. Then I have a class called GeneralTransaction that is an activerecord model. I have a seperate transaction subclass for each affiliate network... AffiliateOneTransaction, etc. Each subclass uses the BaseTransaction mixin module for shared functionality. I am trying to remember, but I think I chose the mixin module method because I could not use Ruby inheritence "<" with activerecord and have a seperate table for each subclass. A GeneralTransaction is inserted every time a subclass record is inserted and GeneralTransaction has subclass & subclass_id fields to reference the records in the subclass table. Seems a little bit hairy to do it this way, but it will work. I am just trying to figure out if there is a more "correct" way to do this design. Any thoughts and suggestions are much appreciated. Thanks if you took the time to read my lengthy post! -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-t...@googlegroups.com. To unsubscribe from this group, send email to rubyonrails-talk+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.