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