diff --git a/lib/discourse_translator/inline_translation.rb b/lib/discourse_translator/inline_translation.rb index 6aec3998..dc3ad15d 100644 --- a/lib/discourse_translator/inline_translation.rb +++ b/lib/discourse_translator/inline_translation.rb @@ -65,6 +65,23 @@ def inject(plugin) !object.topic.locale_matches?(InlineTranslation.effective_locale) && object.topic.translation_for(InlineTranslation.effective_locale).present? end + + plugin.register_topic_preloader_associations( + { + association: :content_locale, + condition: -> do + SiteSetting.translator_enabled && SiteSetting.experimental_inline_translation + end, + }, + ) + plugin.register_topic_preloader_associations( + { + association: :translations, + condition: -> do + SiteSetting.translator_enabled && SiteSetting.experimental_inline_translation + end, + }, + ) end end end diff --git a/spec/serializers/topic_list_serializer_spec.rb b/spec/serializers/topic_list_serializer_spec.rb new file mode 100644 index 00000000..8ae41144 --- /dev/null +++ b/spec/serializers/topic_list_serializer_spec.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +describe TopicListSerializer do + fab!(:topic1) { Fabricate(:topic) } + fab!(:topic2) { Fabricate(:topic) } + fab!(:topic3) { Fabricate(:topic) } + fab!(:user) + + let(:topic_list) { TopicList.new(nil, user, [topic1, topic2, topic3]) } + + before do + SiteSetting.translator_enabled = true + SiteSetting.experimental_inline_translation = true + + # required for other core parts of topic_view + [topic1, topic2, topic3].each { |topic| topic.tap { |t| t.allowed_user_ids = [t.user_id] } } + end + + describe "preloading" do + it "preloads locale and translations without N+1 queries" do + serializer = described_class.new(topic_list, scope: Guardian.new(user)) + + queries = track_sql_queries { serializer.as_json } + + locale_queries = queries.count { |q| q.include?("discourse_translator_topic_locales") } + expect(locale_queries).to eq(1) # would be 3 if not preloaded + + translation_queries = + queries.count { |q| q.include?("discourse_translator_topic_translations") } + expect(translation_queries).to eq(1) # would be 3 if not preloaded + + expect(topic_list.topics.first.association(:content_locale)).to be_loaded + end + + it "never preloads translations if SiteSetting.experimental_inline_translations is false" do + SiteSetting.experimental_inline_translation = false + + serializer = described_class.new(topic_list, scope: Guardian.new(user)) + queries = track_sql_queries { serializer.as_json } + + locale_queries = queries.count { |q| q.include?("discourse_translator_topic_locales") } + expect(locale_queries).to eq(0) + translation_queries = + queries.count { |q| q.include?("discourse_translator_topic_translations") } + expect(translation_queries).to eq(0) + end + end +end