DEV: Allow additional TopicList preloaded associations (#18891)
This provides a means to allow additional associations to be preloaded when generating a TopicList.
This commit is contained in:
parent
2a4fea4372
commit
1a48ea767e
|
@ -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?
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 }
|
||||
|
|
Loading…
Reference in New Issue