2

I'm fairly new to the rails world and I've been tasked with making an online store.

However I am currently having trouble setting up the database relationships. I have product, dimension and shipping classes. A product can have several dimensions, depending on what product variant the customer chooses. The dimensions of the product can dictate how much the shipping will cost, however there will also be several shipping options on offer per dimensions. Here is my current setup:

Product.rb

class Product < ActiveRecord::Base
  attr_accessible :title, :description, :image_url, :price, :category_id, :weighting, :stock
  has_many :dimensions
end

Dimensions.rb

class Weight < ActiveRecord::Base
  attr_accessible :product_id, :size, :weight
  has_and_belongs_to :shippings
  belongs_to :product
end

Shipping.rb

class Shipping < ActiveRecord::Base
  attr_accessible :description, :insurance, :name, :price, :size_id, :weight_id
  has_and_belongs_to :dimensions
end

Could anyone give me some advice as to whether this is the best way to setup this database relation? And if not, what would be a more optimum solution?

I've been told to utilise has_many :through, however I'm not sure how best to implement this.

Thanks

1 Answer 1

1

Typically the deciding factor between has_and_belongs_to_many and has_many :through is whether you think you'll ever need the have the relation object (the one that would tie a has_many :through together) with attributes of its own.

For me, I rarely skimp on over-doing things like this, so I always use has_many :through, and if I don't add attributes to it, so be it. It gives me a model with a useful name for the association, I can validate that association, get callbacks, etc...

The Ruby on Rails Guide has a pretty good comparison between the two.

Also, if you're making a RoR store, have you looked at Spree?

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.