class Locale < ApplicationRecord attr_accessor :certified_tag_names_path around_save :save_with_tag_names!, if: :will_generate_tag_names? belongs_to :language, foreign_key: :language_code, primary_key: :code belongs_to :script, foreign_key: :script_code, primary_key: :code # 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') private def will_generate_tag_names? deprecated_at.nil? && (will_save_change_to_code? || will_save_change_to_deprecated_at?) end def save_with_tag_names! completed = self.class.transaction(requires_new: true) do SharedResourceIdAllocator.lock_space!(Tag, 'tags') saved = yield raise ActiveRecord::RecordNotSaved, 'Locale save was halted' unless saved TagNameCompletion.for_locale!(self) true end unless completed raise ActiveRecord::RecordNotSaved, 'Locale tag completion was rolled back' end end end