diff --git a/app/models/spree/product_decorator.rb b/app/models/spree/product_decorator.rb index dbe21b05dc..bd6e0dd19f 100644 --- a/app/models/spree/product_decorator.rb +++ b/app/models/spree/product_decorator.rb @@ -14,6 +14,13 @@ Spree::Product.class_eval do scope :in_distributor, lambda { |distributor| joins(:product_distributions).where('product_distributions.distributor_id = ?', (distributor.respond_to?(:id) ? distributor.id : distributor.to_i)) } + def shipping_method_for_distributor(distributor) + distribution = self.product_distributions.find_by_distributor_id(distributor) + raise ArgumentError, "This product is not available through that distributor" unless distribution + distribution.shipping_method + end + + # Build a product distribution for each distributor def build_product_distributions Spree::Distributor.all.each do |distributor| diff --git a/spec/models/product_spec.rb b/spec/models/product_spec.rb index e0cfd05a8e..b78a08c6f0 100644 --- a/spec/models/product_spec.rb +++ b/spec/models/product_spec.rb @@ -19,4 +19,21 @@ describe Spree::Product do end end + context "finders" do + it "finds the shipping method for a particular distributor" do + shipping_method = create(:shipping_method) + distributor = create(:distributor) + product = create(:product) + product_distribution = create(:product_distribution, :product => product, :distributor => distributor, :shipping_method => shipping_method) + product.shipping_method_for_distributor(distributor).should == shipping_method + end + + it "raises an error if distributor is not found" do + distributor = create(:distributor) + product = create(:product) + expect do + product.shipping_method_for_distributor(distributor) + end.to raise_error "This product is not available through that distributor" + end + end end