diff --git a/app/models/spree/product_decorator.rb b/app/models/spree/product_decorator.rb index bd6626d296..cd809d880e 100644 --- a/app/models/spree/product_decorator.rb +++ b/app/models/spree/product_decorator.rb @@ -12,7 +12,8 @@ Spree::Product.class_eval do scope :in_supplier, lambda { |supplier| where(:supplier_id => supplier) } scope :in_distributor, lambda { |distributor| joins(:product_distributions).where('product_distributions.distributor_id = ?', (distributor.respond_to?(:id) ? distributor.id : distributor.to_i)) } - scope :in_supplier_or_distributor, lambda { |enterprise| joins('LEFT OUTER JOIN product_distributions ON product_distributions.product_id=spree_products.id'). + scope :in_supplier_or_distributor, lambda { |enterprise| select('distinct spree_products.*'). + joins('LEFT OUTER JOIN product_distributions ON product_distributions.product_id=spree_products.id'). where('supplier_id=? OR product_distributions.distributor_id=?', enterprise.respond_to?(:id) ? enterprise.id : enterprise.to_i, enterprise.respond_to?(:id) ? enterprise.id : enterprise.to_i) } diff --git a/spec/models/product_spec.rb b/spec/models/product_spec.rb index 5943218037..ef777ef5c7 100644 --- a/spec/models/product_spec.rb +++ b/spec/models/product_spec.rb @@ -47,6 +47,18 @@ describe Spree::Product do Spree::Product.in_supplier_or_distributor(s).should == [p] Spree::Product.in_supplier_or_distributor(d).should == [p] end + + it "shows each product once when it is distributed by many distributors" do + s = create(:supplier_enterprise) + d1 = create(:distributor_enterprise) + d2 = create(:distributor_enterprise) + d3 = create(:distributor_enterprise) + p = create(:product, :supplier => s, :distributors => [d1, d2, d3]) + + [s, d1, d2, d3].each do |enterprise| + Spree::Product.in_supplier_or_distributor(enterprise).should == [p] + end + end end end