From 3de887e1d8d3bcd28fac798a9b6221d9f750fde0 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Thu, 19 Mar 2020 23:36:16 +0100 Subject: [PATCH] Remove some N+1s relating to address (found with bullet gem) --- app/controllers/producers_controller.rb | 2 +- app/controllers/shops_controller.rb | 2 +- app/helpers/injection_helper.rb | 8 +++++--- app/helpers/spree/base_helper_decorator.rb | 16 ++++++++++++++++ 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/app/controllers/producers_controller.rb b/app/controllers/producers_controller.rb index 0f45546fde..a5f4752c49 100644 --- a/app/controllers/producers_controller.rb +++ b/app/controllers/producers_controller.rb @@ -8,7 +8,7 @@ class ProducersController < BaseController .activated .visible .is_primary_producer - .includes(address: :state) + .includes(address: [:state, :country]) .includes(:properties) .includes(supplied_products: :properties) .all diff --git a/app/controllers/shops_controller.rb b/app/controllers/shops_controller.rb index 611baa11b8..d4f350b47f 100644 --- a/app/controllers/shops_controller.rb +++ b/app/controllers/shops_controller.rb @@ -8,7 +8,7 @@ class ShopsController < BaseController .activated .visible .is_distributor - .includes(address: :state) + .includes(address: [:state, :country]) .includes(:properties) .includes(supplied_products: :properties) .all diff --git a/app/helpers/injection_helper.rb b/app/helpers/injection_helper.rb index 6ebf77a8fb..a10a4b1fee 100644 --- a/app/helpers/injection_helper.rb +++ b/app/helpers/injection_helper.rb @@ -3,7 +3,7 @@ require 'open_food_network/enterprise_injection_data' module InjectionHelper include SerializerHelper - def inject_enterprises(enterprises = Enterprise.activated.includes(address: :state).all) + def inject_enterprises(enterprises = Enterprise.activated.includes(address: [:state, :country]).all) inject_json_ams( "enterprises", enterprises, @@ -35,13 +35,15 @@ module InjectionHelper inject_json_ams( "enterprises", - Enterprise.activated.visible.select(select_only).includes(address: :state).all, + Enterprise.activated.visible.select(select_only).includes(address: [:state, :country]).all, Api::EnterpriseShopfrontListSerializer ) end def inject_enterprise_and_relatives - inject_json_ams "enterprises", current_distributor.relatives_including_self.activated.includes(address: :state).all, Api::EnterpriseSerializer, enterprise_injection_data + inject_json_ams "enterprises", + current_distributor.relatives_including_self.activated.includes(address: [:state, :country]).all, + Api::EnterpriseSerializer, enterprise_injection_data end def inject_group_enterprises diff --git a/app/helpers/spree/base_helper_decorator.rb b/app/helpers/spree/base_helper_decorator.rb index 67ea0a711d..8d80c51d9a 100644 --- a/app/helpers/spree/base_helper_decorator.rb +++ b/app/helpers/spree/base_helper_decorator.rb @@ -5,5 +5,21 @@ module Spree def variant_options(v, _options = {}) v.options_text end + + # Overriden to eager-load :states + def available_countries + checkout_zone = Zone.find_by_name(Spree::Config[:checkout_zone]) + + if checkout_zone && checkout_zone.kind == 'country' + countries = checkout_zone.country_list + else + countries = Country.includes(:states).all + end + + countries.collect do |country| + country.name = Spree.t(country.iso, scope: 'country_names', default: country.name) + country + end.sort { |a, b| a.name <=> b.name } + end end end