Fetch Property instead of ProducerProps from query

By not having to treat producer properties differently we can filter and
fetch all properties from DB without having to process it with Ruby and
with a single query.
This commit is contained in:
Pau Perez
2018-12-18 18:16:49 +01:00
parent 92e2ed78d1
commit d4635bd7cb
2 changed files with 38 additions and 5 deletions

View File

@@ -85,17 +85,34 @@ module Api
def distributed_properties
if active
product_properties = Spree::Property.currently_sold_by(enterprise)
producer_properties = ProducerProperty.currently_sold_by(enterprise)
else
product_properties = Spree::Property.ever_sold_by(enterprise)
producer_properties = ProducerProperty.ever_sold_by(enterprise)
product_properties = Spree::Property
.joins(products: { variants: { exchanges: :order_cycle } })
.merge(Exchange.outgoing)
.merge(Exchange.to_enterprise(enterprise))
.select('DISTINCT spree_properties.*')
end
(product_properties + producer_properties).uniq do |property_object|
(product_properties + distributed_producer_properties).uniq do |property_object|
property_object.property.presentation
end
end
def distributed_producer_properties
properties = Spree::Property
.joins(
producer_properties: {
producer: { supplied_products: { variants: { exchanges: :order_cycle } } }
}
)
.merge(Exchange.outgoing)
.merge(Exchange.to_enterprise(enterprise))
.select('DISTINCT spree_properties.*')
return properties.merge(OrderCycle.active) if active
properties
end
def active
data.active_distributors.andand.include? enterprise
end

View File

@@ -33,10 +33,10 @@ describe Api::CachedEnterpriseSerializer do
let(:property) { create(:property, presentation: 'One') }
let(:duplicate_property) { create(:property, presentation: 'One') }
let(:producer) { create(:supplier_enterprise, properties: [duplicate_property]) }
before do
product = create(:product, properties: [property])
producer = create(:supplier_enterprise, properties: [duplicate_property])
producer.supplied_products << product
create(
@@ -57,6 +57,14 @@ describe Api::CachedEnterpriseSerializer do
properties = cached_enterprise_serializer.distributed_properties
expect(properties).to eq([property])
end
it 'fetches producer properties' do
distributed_producer_properties = cached_enterprise_serializer
.distributed_producer_properties
expect(distributed_producer_properties)
.to eq(producer.producer_properties.map(&:property))
end
end
context 'when the enterprise is an active distributor' do
@@ -68,6 +76,14 @@ describe Api::CachedEnterpriseSerializer do
properties = cached_enterprise_serializer.distributed_properties
expect(properties).to eq([property])
end
it 'fetches producer properties' do
distributed_producer_properties = cached_enterprise_serializer
.distributed_producer_properties
expect(distributed_producer_properties)
.to eq(producer.producer_properties.map(&:property))
end
end
end
end