From b83a298fe3faf6892303cfc06622fede2898e70d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= <sebastien.gaya@gmail.com> Date: Mon, 24 Apr 2023 12:17:59 +0200 Subject: [PATCH] opti --- .../communication/website/with_connected_objects.rb | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app/models/communication/website/with_connected_objects.rb b/app/models/communication/website/with_connected_objects.rb index 0184fe1eb..99efa55b4 100644 --- a/app/models/communication/website/with_connected_objects.rb +++ b/app/models/communication/website/with_connected_objects.rb @@ -11,12 +11,19 @@ module Communication::Website::WithConnectedObjects # - par un objet avec des connexions lorsqu'il est destroyed # - par le website lui-même au changement du about def destroy_obsolete_connections - # TODO: optimiser up_to_date_dependencies = recursive_dependencies + deletable_connection_ids = [] connections.find_each do |connection| - connection_obsolete = !connection.indirect_object.in?(up_to_date_dependencies) - connection.destroy if connection_obsolete + has_living_connection = up_to_date_dependencies.detect { |dependency| + dependency.class.name == connection.indirect_object_type && + dependency.id == connection.indirect_object_id + } + deletable_connection_ids << connection.id unless has_living_connection end + # On utilise delete_all pour supprimer les connexions obsolètes en une unique requête DELETE FROM + # Cependant, on peut le faire car les connexions n'ont pas de callback. + # Dans le cas où on en rajoute au destroy, il faut repasser sur un appel de destroy sur chaque + connections.where(id: deletable_connection_ids).delete_all end def has_connected_object?(indirect_object) -- GitLab