From 58df00f04d39cf25e7d4d4cbb111bc4cfe1875c4 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Wed, 4 Sep 2024 04:52:37 -0400
Subject: [PATCH] Extract method for self-referencing records in
 `AccountStatusCleanupPolicy` (#31244)

---
 app/models/account_statuses_cleanup_policy.rb | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/app/models/account_statuses_cleanup_policy.rb b/app/models/account_statuses_cleanup_policy.rb
index a102795446..e2c035284b 100644
--- a/app/models/account_statuses_cleanup_policy.rb
+++ b/app/models/account_statuses_cleanup_policy.rb
@@ -145,15 +145,15 @@ class AccountStatusesCleanupPolicy < ApplicationRecord
   end
 
   def without_self_fav_scope
-    Status.where('NOT EXISTS (SELECT 1 FROM favourites fav WHERE fav.account_id = statuses.account_id AND fav.status_id = statuses.id)')
+    Status.where.not(self_status_reference_exists(Favourite))
   end
 
   def without_self_bookmark_scope
-    Status.where('NOT EXISTS (SELECT 1 FROM bookmarks bookmark WHERE bookmark.account_id = statuses.account_id AND bookmark.status_id = statuses.id)')
+    Status.where.not(self_status_reference_exists(Bookmark))
   end
 
   def without_pinned_scope
-    Status.where('NOT EXISTS (SELECT 1 FROM status_pins pin WHERE pin.account_id = statuses.account_id AND pin.status_id = statuses.id)')
+    Status.where.not(self_status_reference_exists(StatusPin))
   end
 
   def without_media_scope
@@ -174,4 +174,13 @@ class AccountStatusesCleanupPolicy < ApplicationRecord
   def account_statuses
     Status.where(account_id: account_id)
   end
+
+  def self_status_reference_exists(model)
+    model
+      .where(model.arel_table[:account_id].eq Status.arel_table[:account_id])
+      .where(model.arel_table[:status_id].eq Status.arel_table[:id])
+      .select(1)
+      .arel
+      .exists
+  end
 end
-- 
GitLab