diff --git a/app/controllers/admin/bulk_line_items_controller.rb b/app/controllers/admin/bulk_line_items_controller.rb index bea712bc41..e7b4237652 100644 --- a/app/controllers/admin/bulk_line_items_controller.rb +++ b/app/controllers/admin/bulk_line_items_controller.rb @@ -4,9 +4,17 @@ module Admin # def index order_params = params[:q].andand.delete :order - orders = OpenFoodNetwork::Permissions.new(spree_current_user).editable_orders.ransack(order_params).result - line_items = OpenFoodNetwork::Permissions.new(spree_current_user).editable_line_items.where(order_id: orders).ransack(params[:q]) - render_as_json line_items.result.reorder('order_id ASC, id ASC') + + orders = OpenFoodNetwork::Permissions.new(spree_current_user). + editable_orders.ransack(order_params).result + + line_items = OpenFoodNetwork::Permissions.new(spree_current_user). + editable_line_items.where(order_id: orders). + includes(variant: { option_values: :option_type }). + ransack(params[:q]).result. + reorder('spree_line_items.order_id ASC, spree_line_items.id ASC') + + render_as_json line_items end # PUT /admin/bulk_line_items/:id.json diff --git a/app/controllers/admin/enterprises_controller.rb b/app/controllers/admin/enterprises_controller.rb index 3f62509eb0..4d91fd2e70 100644 --- a/app/controllers/admin/enterprises_controller.rb +++ b/app/controllers/admin/enterprises_controller.rb @@ -148,7 +148,8 @@ module Admin unless enterprises.empty? enterprises.includes( - supplied_products: [:supplier, :variants, master: [:images]] + supplied_products: + [:supplier, master: [:images], variants: { option_values: :option_type }] ) end when :index diff --git a/app/controllers/api/products_controller.rb b/app/controllers/api/products_controller.rb index c678b7662c..9f692e7449 100644 --- a/app/controllers/api/products_controller.rb +++ b/app/controllers/api/products_controller.rb @@ -115,7 +115,8 @@ module Api def product_query_includes [ master: [:images], - variants: [:default_price, :stock_locations, :stock_items, :variant_overrides] + variants: [:default_price, :stock_locations, :stock_items, :variant_overrides, + { option_values: :option_type }] ] end diff --git a/app/controllers/api/variants_controller.rb b/app/controllers/api/variants_controller.rb index 14575bbabc..c60aa8f7b5 100644 --- a/app/controllers/api/variants_controller.rb +++ b/app/controllers/api/variants_controller.rb @@ -6,12 +6,12 @@ module Api before_filter :product def index - @variants = scope.includes(:option_values).ransack(params[:q]).result + @variants = scope.includes(option_values: :option_type).ransack(params[:q]).result render json: @variants, each_serializer: Api::VariantSerializer end def show - @variant = scope.includes(:option_values).find(params[:id]) + @variant = scope.includes(option_values: :option_type).find(params[:id]) render json: @variant, serializer: Api::VariantSerializer end diff --git a/app/mailers/producer_mailer.rb b/app/mailers/producer_mailer.rb index b772a1da62..959cdf3537 100644 --- a/app/mailers/producer_mailer.rb +++ b/app/mailers/producer_mailer.rb @@ -35,6 +35,7 @@ class ProducerMailer < Spree::BaseMailer def line_items_from(order_cycle, producer) Spree::LineItem. + includes(variant: { option_values: :option_type }). from_order_cycle(order_cycle). sorted_by_name_and_unit_value. merge(Spree::Product.in_supplier(producer)). diff --git a/lib/open_food_network/bulk_coop_report.rb b/lib/open_food_network/bulk_coop_report.rb index d6ff3c9548..5339200185 100644 --- a/lib/open_food_network/bulk_coop_report.rb +++ b/lib/open_food_network/bulk_coop_report.rb @@ -51,8 +51,7 @@ module OpenFoodNetwork def table_items return [] unless @render_table - - Reports::LineItems.list(permissions, params) + Reports::LineItems.list(permissions, report_options) end def rules @@ -122,9 +121,17 @@ module OpenFoodNetwork private + def report_options + @params.merge(line_item_includes: line_item_includes) + end + + def line_item_includes + [{ order: [:bill_address], + variant: [{ option_values: :option_type }, { product: :supplier }] }] + end + def permissions return @permissions unless @permissions.nil? - @permissions = OpenFoodNetwork::Permissions.new(@user) end end diff --git a/lib/open_food_network/orders_and_fulfillments_report/customer_totals_report.rb b/lib/open_food_network/orders_and_fulfillments_report/customer_totals_report.rb index fefaa73b64..c509ce631e 100644 --- a/lib/open_food_network/orders_and_fulfillments_report/customer_totals_report.rb +++ b/lib/open_food_network/orders_and_fulfillments_report/customer_totals_report.rb @@ -190,7 +190,7 @@ module OpenFoodNetwork # rubocop:enable Metrics/PerceivedComplexity def line_item_includes - [{ variant: { product: :supplier }, + [{ variant: [{ option_values: :option_type }, { product: :supplier }], order: [:bill_address, :ship_address, :order_cycle, :adjustments, :payments, :user, :distributor, shipments: { shipping_rates: :shipping_method }] }] end diff --git a/lib/open_food_network/orders_and_fulfillments_report/distributor_totals_by_supplier_report.rb b/lib/open_food_network/orders_and_fulfillments_report/distributor_totals_by_supplier_report.rb index 4f7cdf6f72..71fbf7b0f7 100644 --- a/lib/open_food_network/orders_and_fulfillments_report/distributor_totals_by_supplier_report.rb +++ b/lib/open_food_network/orders_and_fulfillments_report/distributor_totals_by_supplier_report.rb @@ -69,7 +69,7 @@ module OpenFoodNetwork def line_item_includes [{ order: [:distributor, :adjustments, shipments: { shipping_rates: :shipping_method }], - variant: { product: :supplier } }] + variant: [{ option_values: :option_type }, { product: :supplier }] }] end end end diff --git a/lib/open_food_network/orders_and_fulfillments_report/supplier_totals_by_distributor_report.rb b/lib/open_food_network/orders_and_fulfillments_report/supplier_totals_by_distributor_report.rb index b91dcb95d6..63bcf0e121 100644 --- a/lib/open_food_network/orders_and_fulfillments_report/supplier_totals_by_distributor_report.rb +++ b/lib/open_food_network/orders_and_fulfillments_report/supplier_totals_by_distributor_report.rb @@ -69,7 +69,8 @@ module OpenFoodNetwork # rubocop:enable Metrics/AbcSize def line_item_includes - [{ order: :distributor, variant: { product: :supplier } }] + [{ order: :distributor, + variant: [{ option_values: :option_type }, { product: :supplier }] }] end end end diff --git a/lib/open_food_network/orders_and_fulfillments_report/supplier_totals_report.rb b/lib/open_food_network/orders_and_fulfillments_report/supplier_totals_report.rb index 31e8ed30c7..905a06af42 100644 --- a/lib/open_food_network/orders_and_fulfillments_report/supplier_totals_report.rb +++ b/lib/open_food_network/orders_and_fulfillments_report/supplier_totals_report.rb @@ -55,7 +55,7 @@ module OpenFoodNetwork # rubocop:enable Metrics/MethodLength def line_item_includes - [{ variant: { product: :supplier } }] + [{ variant: [{ option_values: :option_type }, { product: :supplier }] }] end end end diff --git a/lib/open_food_network/packing_report.rb b/lib/open_food_network/packing_report.rb index c7dd175d09..3f5e420626 100644 --- a/lib/open_food_network/packing_report.rb +++ b/lib/open_food_network/packing_report.rb @@ -43,8 +43,7 @@ module OpenFoodNetwork def table_items return [] unless @render_table - - Reports::LineItems.list(permissions, params) + Reports::LineItems.list(permissions, report_options) end def rules @@ -121,9 +120,17 @@ module OpenFoodNetwork private + def report_options + @params.merge(line_item_includes: line_item_includes) + end + + def line_item_includes + [{ order: [:bill_address, :distributor], + variant: [{ option_values: :option_type }, { product: :supplier }] }] + end + def permissions return @permissions unless @permissions.nil? - @permissions = OpenFoodNetwork::Permissions.new(@user) end diff --git a/lib/open_food_network/products_and_inventory_report_base.rb b/lib/open_food_network/products_and_inventory_report_base.rb index e7583f2c0c..d0f4a50de8 100644 --- a/lib/open_food_network/products_and_inventory_report_base.rb +++ b/lib/open_food_network/products_and_inventory_report_base.rb @@ -25,6 +25,7 @@ module OpenFoodNetwork def child_variants Spree::Variant. where(is_master: false). + includes(option_values: :option_type). joins(:product). merge(visible_products). order('spree_products.name') diff --git a/lib/open_food_network/scope_variants_for_search.rb b/lib/open_food_network/scope_variants_for_search.rb index 24b110fb6e..ddf1d48771 100644 --- a/lib/open_food_network/scope_variants_for_search.rb +++ b/lib/open_food_network/scope_variants_for_search.rb @@ -30,7 +30,9 @@ module OpenFoodNetwork end def query_scope - Spree::Variant.where(is_master: false).ransack(search_params.merge(m: 'or')).result + Spree::Variant.where(is_master: false). + includes(option_values: :option_type). + ransack(search_params.merge(m: 'or')).result end def distributor diff --git a/lib/open_food_network/variant_and_line_item_naming.rb b/lib/open_food_network/variant_and_line_item_naming.rb index a962dd6893..596b93beee 100644 --- a/lib/open_food_network/variant_and_line_item_naming.rb +++ b/lib/open_food_network/variant_and_line_item_naming.rb @@ -8,11 +8,17 @@ module OpenFoodNetwork module VariantAndLineItemNaming # Copied and modified from Spree::Variant def options_text - values = option_values.joins(:option_type).order("#{Spree::OptionType.table_name}.position asc") + values = if option_values_eager_loaded? + # Don't trigger N+1 queries if option_values are already eager-loaded. + # For best results, use: `Spree::Variant.includes(option_values: :option_type)` + # or: `Spree::Product.includes(variant: {option_values: :option_type})` + option_values.sort_by{ |o| o.option_type.position } + else + option_values.joins(:option_type). + order("#{Spree::OptionType.table_name}.position asc") + end - values.map!(&:presentation) # This line changed - - values.to_sentence(words_connector: ", ", two_words_connector: ", ") + values.map(&:presentation).to_sentence(words_connector: ", ", two_words_connector: ", ") end def product_and_full_name @@ -69,6 +75,10 @@ module OpenFoodNetwork private + def option_values_eager_loaded? + option_values.loaded? + end + def option_value_name if has_attribute?(:display_as) && display_as.present? display_as diff --git a/lib/open_food_network/xero_invoices_report.rb b/lib/open_food_network/xero_invoices_report.rb index 3ccf7dd25f..36bbdf9fe8 100644 --- a/lib/open_food_network/xero_invoices_report.rb +++ b/lib/open_food_network/xero_invoices_report.rb @@ -43,6 +43,15 @@ module OpenFoodNetwork private + def report_options + @opts.merge(line_item_includes: line_item_includes) + end + + def line_item_includes + [:bill_address, :adjustments, + line_items: { variant: [{ option_values: :option_type }, { product: :supplier }] }] + end + def detail_rows_for_order(order, invoice_number, opts) rows = []