From 50d148d412f80d4b80236fd836a9cb10e588f929 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 19 Jan 2024 10:40:03 +0100 Subject: [PATCH] perf(types_de_champs_controller): preload procedure to avoid n+1 query in champs_summary --- .../administrateurs/procedures_controller.rb | 33 ++----------------- .../types_de_champ_controller.rb | 5 +++ app/models/procedure.rb | 28 ++++++++++++++++ 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/app/controllers/administrateurs/procedures_controller.rb b/app/controllers/administrateurs/procedures_controller.rb index 6cd846529..89548798a 100644 --- a/app/controllers/administrateurs/procedures_controller.rb +++ b/app/controllers/administrateurs/procedures_controller.rb @@ -362,40 +362,11 @@ module Administrateurs end def champs - @procedure = Procedure.includes(draft_revision: { - revision_types_de_champ: { - type_de_champ: { piece_justificative_template_attachment: :blob, revision: [], procedure: [] }, - revision: [], - procedure: [] - }, - revision_types_de_champ_public: { - type_de_champ: { piece_justificative_template_attachment: :blob, revision: [], procedure: [] }, - revision: [], - procedure: [] - }, - procedure: [] - }).find(@procedure.id) + @procedure = Procedure.includes_for_champ_public_edition.find(@procedure.id) end def annotations - @procedure = Procedure.includes(draft_revision: { - revision_types_de_champ: { - type_de_champ: { piece_justificative_template_attachment: :blob, revision: [], procedure: [] }, - revision: [], - procedure: [] - }, - revision_types_de_champ_private: { - type_de_champ: { piece_justificative_template_attachment: :blob, revision: [], procedure: [] }, - revision: [], - procedure: [] - }, - revision_types_de_champ_public: { - type_de_champ: { piece_justificative_template_attachment: :blob, revision: [], procedure: [] }, - revision: [], - procedure: [] - }, - procedure: [] - }).find(@procedure.id) + @procedure = Procedure.includes_for_champ_private_edition.find(@procedure.id) end def detail diff --git a/app/controllers/administrateurs/types_de_champ_controller.rb b/app/controllers/administrateurs/types_de_champ_controller.rb index 4052fd02a..cb1de66f8 100644 --- a/app/controllers/administrateurs/types_de_champ_controller.rb +++ b/app/controllers/administrateurs/types_de_champ_controller.rb @@ -1,6 +1,7 @@ module Administrateurs class TypesDeChampController < AdministrateurController before_action :retrieve_procedure + before_action :preload_procedure after_action :reset_procedure, only: [:create, :update, :destroy, :piece_justificative_template] def create @@ -169,5 +170,9 @@ module Administrateurs def draft @procedure.draft_revision end + + def preload_procedure + @procedure = Procedure.includes_for_champ_private_edition.find(@procedure.id) + end end end diff --git a/app/models/procedure.rb b/app/models/procedure.rb index 012b026bf..55a1ffe8c 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -237,6 +237,34 @@ class Procedure < ApplicationRecord ) } + scope :includes_for_champ_public_edition, -> { + includes(draft_revision: { + revision_types_de_champ: { + type_de_champ: { piece_justificative_template_attachment: :blob, revision: [], procedure: [] }, + revision: [], + procedure: [] + }, + revision_types_de_champ_public: { + type_de_champ: { piece_justificative_template_attachment: :blob, revision: [], procedure: [] }, + revision: [], + procedure: [] + }, + procedure: [] + }) + } + + scope :includes_for_champ_private_edition, -> { + includes_for_champ_public_edition.includes( + draft_revision: { + revision_types_de_champ_private: { + type_de_champ: { piece_justificative_template_attachment: :blob, revision: [], procedure: [] }, + revision: [], + procedure: [] + } + } + ) + } + validates :libelle, presence: true, allow_blank: false, allow_nil: false validates :description, presence: true, allow_blank: false, allow_nil: false validates :administrateurs, presence: true