diff --git a/backend/app/controllers/tags_controller.rb b/backend/app/controllers/tags_controller.rb index 4cc88a7..08539a3 100644 --- a/backend/app/controllers/tags_controller.rb +++ b/backend/app/controllers/tags_controller.rb @@ -175,7 +175,8 @@ class TagsController < ApplicationController tags_by_id = Tag .joins(:tag_names) - .includes(:tag_names, :materials, :tag_descriptions, parents: :tag_descriptions) + .preload(:tag_names, :materials, :deerjikists, :tag_descriptions, + parents: [:tag_names, :materials, :deerjikists, :tag_descriptions]) .where(tag_names: { language_code: locale.language_code, primary_flg: true }, id: tag_ids) .index_by(&:id) @@ -238,7 +239,8 @@ class TagsController < ApplicationController base = Tag .joins(:tag_names) - .includes(:tag_names, :materials, :tag_descriptions, parents: :tag_descriptions) + .preload(:tag_names, :materials, :deerjikists, :tag_descriptions, + parents: [:tag_names, :materials, :deerjikists, :tag_descriptions]) .where(tag_names: { language_code: locale.language_code, primary_flg: true }, deprecated_at: nil) base = base.where('tags.post_count > 0') if present_only @@ -282,7 +284,8 @@ class TagsController < ApplicationController tag = Tag .joins(:tag_names) - .includes(:tag_names, :materials, :tag_descriptions, parents: :tag_descriptions) + .preload(:tag_names, :materials, :deerjikists, :tag_descriptions, + parents: [:tag_names, :materials, :deerjikists, :tag_descriptions]) .find_by(id: params[:id], tag_names: { language_code: locale.language_code, primary_flg: true }) return render json: TagRepr.base(tag, language_code: locale.language_code) if tag @@ -302,7 +305,8 @@ class TagsController < ApplicationController tag = Tag .joins(:tag_names) - .includes(:tag_names, :materials, :tag_descriptions, parents: :tag_descriptions) + .preload(:tag_names, :materials, :deerjikists, :tag_descriptions, + parents: [:tag_names, :materials, :deerjikists, :tag_descriptions]) .find_by(tag_names: { name:, language_code: locale.language_code, primary_flg: true }) return render json: TagRepr.base(tag, language_code: locale.language_code) if tag @@ -320,7 +324,8 @@ class TagsController < ApplicationController tag = Tag.joins(:tag_names) - .includes(:tag_names, :tag_descriptions, parents: :tag_descriptions) + .preload(:tag_names, :materials, :deerjikists, :tag_descriptions, + parents: [:tag_names, :materials, :deerjikists, :tag_descriptions]) .find_by(id: params[:id], tag_names: { language_code: locale.language_code, primary_flg: true }) return head :not_found unless tag @@ -340,7 +345,8 @@ class TagsController < ApplicationController tag = Tag .joins(:tag_names) - .includes(:tag_names, :tag_descriptions, parents: :tag_descriptions) + .preload(:tag_names, :materials, :deerjikists, :tag_descriptions, + parents: [:tag_names, :materials, :deerjikists, :tag_descriptions]) .find_by(tag_names: { name:, language_code: locale.language_code, primary_flg: true }) return head :not_found unless tag @@ -359,7 +365,8 @@ class TagsController < ApplicationController tag = Tag .joins(:tag_names) - .includes(:tag_names, :tag_descriptions, parents: :tag_descriptions) + .preload(:tag_names, :materials, :deerjikists, :tag_descriptions, + parents: [:tag_names, :materials, :deerjikists, :tag_descriptions]) .find_by(id: params[:id], tag_names: { language_code: locale.language_code, primary_flg: true }) return head :not_found unless tag @@ -425,7 +432,8 @@ class TagsController < ApplicationController tag = Tag .joins(:tag_names) - .includes(:tag_names, :materials, :tag_descriptions, parents: :tag_descriptions) + .preload(:tag_names, :materials, :deerjikists, :tag_descriptions, + parents: [:tag_names, :materials, :deerjikists, :tag_descriptions]) .find_by(tag_names: { name:, language_code: locale.language_code, primary_flg: true }) return head :not_found unless tag diff --git a/backend/app/models/locale.rb b/backend/app/models/locale.rb index 6993bd0..add01f1 100644 --- a/backend/app/models/locale.rb +++ b/backend/app/models/locale.rb @@ -6,7 +6,13 @@ class Locale < ApplicationRecord belongs_to :language, foreign_key: :language_code, primary_key: :code belongs_to :script, foreign_key: :script_code, primary_key: :code - enum :code, ja: 'ja', ain_kana: 'ain-Kana' + # Enum deserialisation uses the first key for each stored value. + # Keep the legacy key for existing predicates, scopes and query arguments. + enum :code, { ja: 'ja', 'ain-Kana' => 'ain-Kana', ain_kana: 'ain-Kana' } + + def code= value + super(self.class.codes.fetch(value.to_s, value)) + end def self.nipponese = Locale.find('ja') diff --git a/backend/app/models/script.rb b/backend/app/models/script.rb index 83bd7d1..d4563f0 100644 --- a/backend/app/models/script.rb +++ b/backend/app/models/script.rb @@ -1,5 +1,11 @@ class Script < ApplicationRecord has_many :locales, foreign_key: :script_code, primary_key: :code - enum :code, jpan: 'Jpan', kana: 'Kana' + # Canonical keys come first so reads and plucks retain ISO 15924 spelling. + # Legacy keys preserve the existing enum predicates, scopes and queries. + enum :code, { 'Jpan' => 'Jpan', 'Kana' => 'Kana', jpan: 'Jpan', kana: 'Kana' } + + def code= value + super(self.class.codes.fetch(value.to_s, value)) + end end diff --git a/backend/app/services/tag_version_recorder.rb b/backend/app/services/tag_version_recorder.rb index 6cf835f..c0f1bb6 100644 --- a/backend/app/services/tag_version_recorder.rb +++ b/backend/app/services/tag_version_recorder.rb @@ -18,7 +18,11 @@ class TagVersionRecorder < VersionRecorder def snapshot_attributes names = snapshot_names - compatibility_names = names['ja'] || names.fetch('ain') + compatibility_names = names['ja'] || names['ain'] || names.values.first + unless compatibility_names + @record.errors.add(:tag_names, :invalid) + raise ActiveRecord::RecordInvalid, @record + end parent_ids = TagImplication.where(tag_id: @record.id).order(:parent_tag_id) .lock.pluck(:parent_tag_id) @@ -35,12 +39,18 @@ class TagVersionRecorder < VersionRecorder @record.tag_names.order(:language_code, :name).lock.group_by(&:language_code) .transform_values do |tag_names| primary = tag_names.find(&:primary?) + unless primary + @record.errors.add(:tag_names, :invalid, + language_code: tag_names.first.language_code) + raise ActiveRecord::RecordInvalid, @record + end aliases = tag_names.reject(&:primary?).sort_by(&:name).map { |tag_name| - { 'name' => tag_name.name, 'script_code' => tag_name.script_code } + { 'name' => tag_name.name, + 'script_code' => Script.codes.fetch(tag_name.script_code, tag_name.script_code) } } { 'name' => primary.name, - 'script_code' => primary.script_code, + 'script_code' => Script.codes.fetch(primary.script_code, primary.script_code), 'auto_generated' => primary.auto_generated, 'aliases' => aliases } end