From c4a8076ade42771ef28869cc92c6bc7c12734168 Mon Sep 17 00:00:00 2001 From: Codex Night Worker Date: Sun, 15 Nov 2026 15:41:15 +0900 Subject: [PATCH] AI: address issue #445 --- backend/app/services/counts_table_query.rb | 2 +- backend/spec/requests/counts_table_spec.rb | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/backend/app/services/counts_table_query.rb b/backend/app/services/counts_table_query.rb index ecb3085..38eb9e0 100644 --- a/backend/app/services/counts_table_query.rb +++ b/backend/app/services/counts_table_query.rb @@ -182,7 +182,7 @@ class CountsTableQuery order = sort_sql { detail_expression(_1) } query = query.order(Arel.sql((order + ['v.id ASC']).join(', '))) .limit(limit).offset((page - 1) * limit) - query = query.includes(:external_tag) if @definition.resource == 'nico_tags' + query = query.preload(:external_tag) if @definition.resource == 'nico_tags' rows = query.to_a if ['posts', 'tags'].include?(@definition.resource) point = population.history ? population.at : diff --git a/backend/spec/requests/counts_table_spec.rb b/backend/spec/requests/counts_table_spec.rb index feb5ffe..4f65e9d 100644 --- a/backend/spec/requests/counts_table_spec.rb +++ b/backend/spec/requests/counts_table_spec.rb @@ -74,6 +74,25 @@ RSpec.describe 'Counts table API', type: :request do end end + it 'preloads external names separately for aliased link-change details' do + statements = [] + listener = lambda do |_name, _start, _finish, _id, payload| + statements << payload[:sql] + end + ActiveSupport::Notifications.subscribed(listener, 'sql.active_record') do + result = query(axis('changed_field', 'linked_tags')) + expect(versions(result)).to eq([2, 3]) + expect(result.fetch('versions').map { _1.fetch('name') }) + .to eq(['nico:beta', 'nico:beta']) + end + + details = statements.find { _1.include?('AS counts_latest') } + expect(details).not_to be_nil + expect(details).not_to include('JOIN `external_tags`') + names = statements.select { _1.match?(/SELECT .* FROM `external_tags`/) } + expect(names.length).to eq(1) + end + it 'advertises the legacy field, label and default columns only' do get '/counts/definitions/nico_tags', params: { locale: 'ja' } expect(response).to have_http_status(:ok)