When loading products for shopfront, load all master variants in one go

This commit is contained in:
Rohan Mitchell
2015-05-20 15:22:01 +10:00
parent 99cb09c6f7
commit c5f00d87bd
2 changed files with 33 additions and 18 deletions

View File

@@ -17,7 +17,8 @@ class ShopController < BaseController
each_serializer: Api::ProductSerializer,
current_order_cycle: current_order_cycle,
current_distributor: current_distributor,
variants: variants_for_shop_by_id).to_json
variants: variants_for_shop_by_id,
master_variants: master_variants_for_shop_by_id).to_json
else
render json: "", status: 404
@@ -49,23 +50,6 @@ class ShopController < BaseController
end
end
def variants_for_shop_by_id
# We use the in_stock? method here instead of the in_stock scope because we need to
# look up the stock as overridden by VariantOverrides, and the scope method is not affected
# by them.
variants = Spree::Variant.
where(is_master: false).
for_distribution(current_order_cycle, current_distributor).
each { |v| v.scope_to_hub current_distributor }.
select(&:in_stock?)
variants.inject({}) do |vs, v|
vs[v.product_id] ||= []
vs[v.product_id] << v
vs
end
end
def taxon_order
if current_distributor.preferred_shopfront_taxon_order.present?
current_distributor
@@ -76,4 +60,30 @@ class ShopController < BaseController
"name ASC"
end
end
def all_variants_for_shop
# We use the in_stock? method here instead of the in_stock scope because we need to
# look up the stock as overridden by VariantOverrides, and the scope method is not affected
# by them.
Spree::Variant.
for_distribution(current_order_cycle, current_distributor).
each { |v| v.scope_to_hub current_distributor }.
select(&:in_stock?)
end
def variants_for_shop_by_id
index_by_product_id all_variants_for_shop.reject(&:is_master)
end
def master_variants_for_shop_by_id
index_by_product_id all_variants_for_shop.select(&:is_master)
end
def index_by_product_id(variants)
variants.inject({}) do |vs, v|
vs[v.product_id] ||= []
vs[v.product_id] << v
vs
end
end
end

View File

@@ -49,4 +49,9 @@ class Api::CachedProductSerializer < ActiveModel::Serializer
def variants
options[:variants][object.id] || []
end
def master
options[:master_variants][object.id].andand.first
end
end