diff --git a/backend/app/models/tag.rb b/backend/app/models/tag.rb index a1372c7..491a0e3 100644 --- a/backend/app/models/tag.rb +++ b/backend/app/models/tag.rb @@ -1,5 +1,5 @@ class Tag < ApplicationRecord - class NicoTagNormalisationError < StandardError + class NicoTagNormalisationError < ArgumentError ; end @@ -67,12 +67,14 @@ class Tag < ApplicationRecord @bot ||= find_or_create_by_tag_name!('bot操作', category: 'meta') end - def self.normalise_tags tag_names, with_tagme: true - tags = tag_names.map do |name| - raise NicoTagNormalisationError if name.start_with?('nico:') + def self.normalise_tags tag_names, with_tagme: true, deny_nico: true + if deny_nico && tag_names.any? { |n| n.start_with?('nico:') } + raise NicoTagNormalisationError + end + tags = tag_names.map do |name| pf, cat = CATEGORY_PREFIXES.find { |p, _| name.start_with?(p) } || ['', nil] - name.delete_prefix!(pf) + name = name.delete_prefix(pf) find_or_create_by_tag_name!(name, category: (cat || 'general')).tap do |tag| if cat && tag.category != cat tag.update!(category: cat) @@ -107,11 +109,13 @@ class Tag < ApplicationRecord (result + tags).uniq { |t| t.id } end - def self.find_or_create_by_tag_name!(name, category:) + def self.find_or_create_by_tag_name! name, category: tn = TagName.find_or_create_by!(name: name.to_s.strip) Tag.find_or_create_by!(tag_name_id: tn.id) do |t| t.category = category end + rescue ActiveRecord::RecordNotUnique + retry end private