From 1a48ea767e950e3c307632fd0c130f7bf6cce87f Mon Sep 17 00:00:00 2001 From: jbrw Date: Mon, 12 Dec 2022 09:08:13 -0500 Subject: [PATCH] DEV: Allow additional TopicList preloaded associations (#18891) This provides a means to allow additional associations to be preloaded when generating a TopicList. --- app/models/topic_list.rb | 5 ++++- lib/discourse_plugin_registry.rb | 1 + lib/plugin/instance.rb | 4 ++++ spec/lib/topic_query_spec.rb | 16 ++++++++++++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/app/models/topic_list.rb b/app/models/topic_list.rb index d13c2ab3ecd..815e9c23085 100644 --- a/app/models/topic_list.rb +++ b/app/models/topic_list.rb @@ -136,8 +136,11 @@ class TopicList ft.topic_list = self end + topic_preloader_associations = [:image_upload, { topic_thumbnails: :optimized_image }] + topic_preloader_associations.concat(DiscoursePluginRegistry.topic_preloader_associations.to_a) + ActiveRecord::Associations::Preloader - .new(records: @topics, associations: [:image_upload, topic_thumbnails: :optimized_image]) + .new(records: @topics, associations: topic_preloader_associations) .call if preloaded_custom_fields.present? diff --git a/lib/discourse_plugin_registry.rb b/lib/discourse_plugin_registry.rb index c9d0baf5915..7272b4f0b76 100644 --- a/lib/discourse_plugin_registry.rb +++ b/lib/discourse_plugin_registry.rb @@ -80,6 +80,7 @@ class DiscoursePluginRegistry define_filtered_register :group_params define_filtered_register :topic_thumbnail_sizes + define_filtered_register :topic_preloader_associations define_filtered_register :api_parameter_routes define_filtered_register :api_key_scope_mappings diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb index 09ceac7804e..579c9ffd894 100644 --- a/lib/plugin/instance.rb +++ b/lib/plugin/instance.rb @@ -1220,6 +1220,10 @@ class Plugin::Instance end end + def register_topic_preloader_associations(fields) + DiscoursePluginRegistry.register_topic_preloader_association(fields, self) + end + private def validate_directory_column_name(column_name) diff --git a/spec/lib/topic_query_spec.rb b/spec/lib/topic_query_spec.rb index e09227b7120..3b689982f5d 100644 --- a/spec/lib/topic_query_spec.rb +++ b/spec/lib/topic_query_spec.rb @@ -919,6 +919,22 @@ RSpec.describe TopicQuery do end end + context 'when preloading associations' do + it "preloads associations" do + DiscoursePluginRegistry.register_topic_preloader_association(:first_post, Plugin::Instance.new) + + topic = Fabricate(:topic) + Fabricate(:post, topic: topic) + + new_topic = topic_query.list_new.topics.first + expect(new_topic.association(:image_upload).loaded?).to eq(true) # Preloaded by default + expect(new_topic.association(:first_post).loaded?).to eq(true) # Testing a user-defined preloaded association + expect(new_topic.association(:user).loaded?).to eq(false) # Testing the negative + + DiscoursePluginRegistry.reset_register!(:topic_preloader_associations) + end + end + context 'with a new topic' do let!(:new_topic) { Fabricate(:topic, user: creator, bumped_at: 10.minutes.ago) } let(:topics) { topic_query.list_new.topics }