diff --git a/plugin.rb b/plugin.rb index bf5dbc3..dc05551 100644 --- a/plugin.rb +++ b/plugin.rb @@ -306,10 +306,9 @@ after_initialize do topic_assignments&.find { |assignment| assignment.target_type == "Topic" } indirect_assignments = topic_assignments&.select { |assignment| assignment.target_type == "Post" } - if direct_assignment - assigned_to = direct_assignment.assigned_to - post.topic.preload_assigned_to(assigned_to) - end + + post.topic.preload_assigned_to(direct_assignment&.assigned_to) + post.topic.preload_indirectly_assigned_to(nil) if indirect_assignments.present? indirect_assignment_map = indirect_assignments.reduce({}) do |acc, assignment| diff --git a/spec/requests/search_controller_spec.rb b/spec/requests/search_controller_spec.rb index 4ba60f0..4e4e3b6 100644 --- a/spec/requests/search_controller_spec.rb +++ b/spec/requests/search_controller_spec.rb @@ -37,4 +37,21 @@ describe SearchController do expect(assigned_to_group_data["assign_icon"]).to eq("group-plus") expect(assigned_to_group_data["assign_path"]).to eq("/g/#{group.name}/assigned/everyone") end + + it "does not result in N+1 queries when search returns multiple results" do + SearchIndexer.enable + SiteSetting.assigns_public = true + post = Fabricate(:post, topic: Fabricate(:topic, title: "this is an awesome title")) + + get "/search/query.json", params: { term: "awesome" } + + initial_sql_queries_count = + track_sql_queries { get "/search/query.json", params: { term: "awesome" } }.count + + Fabricate(:post, topic: Fabricate(:topic, title: "this is an awesome title 2")) + Fabricate(:post, topic: Fabricate(:topic, title: "this is an awesome title 3")) + new_sql_queries_count = + track_sql_queries { get "/search/query.json", params: { term: "awesome" } }.count + expect(new_sql_queries_count).to eq(initial_sql_queries_count) + end end