From 5a7c565396f824d4d81bb45fbcac922422e02162 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 23 Mar 2026 11:53:56 -0400 Subject: [PATCH] Extract common lists for status/reblog preload/cacheable (#35285) --- app/controllers/admin/statuses_controller.rb | 6 ++- app/models/status.rb | 44 +++++++++----------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/app/controllers/admin/statuses_controller.rb b/app/controllers/admin/statuses_controller.rb index 7e75d841b5..21c4e5529e 100644 --- a/app/controllers/admin/statuses_controller.rb +++ b/app/controllers/admin/statuses_controller.rb @@ -62,7 +62,11 @@ module Admin end def set_statuses - @statuses = Admin::StatusFilter.new(@account, filter_params).results.preload(:application, :preloadable_poll, :media_attachments, active_mentions: :account, reblog: [:account, :application, :preloadable_poll, :media_attachments, active_mentions: :account]).page(params[:page]).per(PER_PAGE) + @statuses = Admin::StatusFilter.new(@account, filter_params).results.preload(*preload_columns, reblog: [:account, *preload_columns]).page(params[:page]).per(PER_PAGE) + end + + def preload_columns + [:application, :preloadable_poll, :media_attachments, active_mentions: :account] end def filter_params diff --git a/app/models/status.rb b/app/models/status.rb index 9a69c0a8ba..ef41caca02 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -45,6 +45,20 @@ class Status < ApplicationRecord include Status::Visibility include Status::InteractionPolicyConcern + CACHEABLE_ASSOCIATIONS = [ + :application, + :conversation, + :media_attachments, + :preloadable_poll, + :status_stat, + :tags, + account: [:account_stat, user: :role], + active_mentions: :account, + tagged_objects: :object, + preview_cards_status: { preview_card: { author_account: [:account_stat, user: :role] } }, + quote: { status: { account: [:account_stat, user: :role] } }, + ].freeze + MEDIA_ATTACHMENTS_LIMIT = 4 rate_limit by: :account, family: :statuses @@ -163,31 +177,11 @@ class Status < ApplicationRecord # the `dependent: destroy` callbacks remove relevant records before_destroy :unlink_from_conversations!, prepend: true - cache_associated :application, - :media_attachments, - :conversation, - :status_stat, - :tags, - :preloadable_poll, - quote: { status: { account: [:account_stat, user: :role] } }, - preview_cards_status: { preview_card: { author_account: [:account_stat, user: :role] } }, - account: [:account_stat, user: :role], - active_mentions: :account, - tagged_objects: :object, - reblog: [ - :application, - :media_attachments, - :conversation, - :status_stat, - :tags, - :preloadable_poll, - quote: { status: { account: [:account_stat, user: :role] } }, - preview_cards_status: { preview_card: { author_account: [:account_stat, user: :role] } }, - account: [:account_stat, user: :role], - active_mentions: :account, - tagged_objects: :object, - ], - thread: :account + cache_associated( + *CACHEABLE_ASSOCIATIONS, + reblog: [*CACHEABLE_ASSOCIATIONS], + thread: :account + ) delegate :domain, :indexable?, to: :account, prefix: true