Polymorphic Data Modelling Question

Hello,

I am not sure of the best way to model this situation in Rails and would appreciate some guidance.

An order can hold multiple line items. Each line item is for a certain number of any given product. There are four products, each in a different table because they have completely different attributes. So I have:

Order    - has many LineItems

LineItem    - belongs to an Order    - holds the quantity of the particular product    - has one {ProductA or ProductB or ProductC or ProductD}

ProductA    - belongs to many LineItems    - holds various attributes unique to product A

ProductB    - belongs to many LineItems    - holds various attributes unique to product B

...etc for ProductC and ProductB

How do I set up LineItem so it is polymorphic with respect to the product it has?

I know I could merge all the products into one giant product table with the superset of all the products' attributes, but I really don't want to.

What's the best way to handle this situation?

Thanks in advance, Andy Stewart

OK, I worked out how to do this. Here's the answer to my own question:

An order can hold multiple line items. Each line item is for a certain number of any given product. There are four products, each in a different table because they have completely different attributes. So I have:

Order   - has many LineItems

LineItem   - belongs to an Order   - holds the quantity of the particular product   - has one {ProductA or ProductB or ProductC or ProductD}

ProductA   - belongs to many LineItems   - holds various attributes unique to product A

ProductB   - belongs to many LineItems   - holds various attributes unique to product B

...etc for ProductC and ProductB

How do I set up LineItem so it is polymorphic with respect to the product it has?

LineItem    - belongs_to :orderable, ;polymorphic => true    - column :orderable_id, :integer    - column :orderable_type, :string

ProductA    - has_one :line_item, :as => orderable

ProductB, ProductC, ProductD    - as for ProductA

Regards, Andy Stewart