mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
Remove N+1 in editable_variants_for_incoming_exchanges
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user