LearningRoR
LearningRoR

Reputation: 27202

How to setup the associations for an "Options" model?

If had had the models Store, Product, User and Price with the following associations

class User < ActiveRecord::Base
  has_many :products
  has_many :stores
  has_many :prices
end

class Store < ActiveRecord::Base
  belongs_to :user
  has_many :prices
end

class Product < ActiveRecord::Base
  belongs_to :user
  has_many :prices
end

class Price < ActiveRecord::Base
  belongs_to :user
  belongs_to :product
  belongs_to :store
end

class Estate < ActiveRecord::Base
  belongs_to :user
end

And want to create a Option model that holds the models specific option type with things like, if an Estate has a backyard, swimming pool, tennis court or a price has a deal, discount or buy one get one free. Would this be done by a polymorphic association? I'm doing this so I don't have to create a Option model for each model and can just have one model for all new options I want to add. So is this the correct way to go about this?

Upvotes: 0

Views: 85

Answers (1)

Callmeed
Callmeed

Reputation: 4992

If you use a polymorphic option model, then the fields would be the same for each class/record an object belongs to. I don't think this is what you want since a deal doesn't have a swimming pool and an estate isn't buy-one-get-one (I wish!).

I would look into using Rails 3.2 and the ActiveRecord::Store feature. With this, just add a single text column to your model(s) (call it "options") and then you can define all the options you need.

class Estate < ActiveRecord::Base
  belongs_to :user
  store :options, accessors: [ :backyard, :pool, :tennis, :butler, :wine_cellar ]
end

estate = Estate.new
estate.pool = true
estate.options[:number_of_sharks] = 3 # Attributes not defined as accessors work too

Upvotes: 2

Related Questions