Remove N+1 in editable_variants_for_incoming_exchanges

This commit is contained in:
Matt-Yorkley
2019-08-09 09:32:18 +01:00
committed by luisramos0
parent f4d71ae352
commit e73f2d682c
2 changed files with 24 additions and 8 deletions

View File

@@ -33,14 +33,7 @@ class Api::Admin::OrderCycleSerializer < ActiveModel::Serializer
end
def editable_variants_for_incoming_exchanges
# For each enterprise that the current user is able to see in this order cycle,
# work out which variants should be editable within incoming exchanges from that enterprise
editable = {}
visible_enterprises.each do |enterprise|
variants = permissions.editable_variants_for_incoming_exchanges_from(enterprise).pluck(:id)
editable[enterprise.id] = variants if variants.any?
end
editable
sort_by_supplier_id(permissions.all_incoming_editable_variants.all)
end
def editable_variants_for_outgoing_exchanges
@@ -85,4 +78,18 @@ class Api::Admin::OrderCycleSerializer < ActiveModel::Serializer
def visible_enterprises
@visible_enterprises ||= permissions.visible_enterprises
end
def sort_by_supplier_id(variants)
collection = {}
variants.map do |variant|
supplier_id = variant.product.supplier_id
if collection.key? supplier_id
collection[supplier_id] << variant.id
else
collection[supplier_id] = [variant.id]
end
end
collection
end
end

View File

@@ -154,6 +154,15 @@ module OpenFoodNetwork
end
end
def all_incoming_editable_variants
valid_suppliers = visible_enterprises.map do |enterprise|
enterprise.id if user_manages_coordinator_or(enterprise)
end
Spree::Variant.includes(product: :supplier).
joins(:product).where('spree_products.supplier_id IN (?)', valid_suppliers)
end
# Find the variants that a user is permitted see within outgoing exchanges
# Note that this does not determine whether they actually appear in outgoing exchanges
# as this requires first that the variant is included in an incoming exchange