|
|
|
@@ -3,53 +3,51 @@ class Tag < ApplicationRecord |
|
|
|
; |
|
|
|
end |
|
|
|
|
|
|
|
has_many :post_tags, dependent: :delete_all, inverse_of: :tag |
|
|
|
has_many :post_tags, inverse_of: :tag |
|
|
|
has_many :active_post_tags, -> { kept }, class_name: 'PostTag', inverse_of: :tag |
|
|
|
has_many :post_tags_with_discarded, -> { with_discarded }, class_name: 'PostTag' |
|
|
|
has_many :posts, through: :active_post_tags |
|
|
|
has_many :tag_aliases, dependent: :destroy |
|
|
|
|
|
|
|
has_many :nico_tag_relations, foreign_key: :nico_tag_id, dependent: :destroy |
|
|
|
has_many :linked_tags, through: :nico_tag_relations, source: :tag |
|
|
|
|
|
|
|
has_many :reversed_nico_tag_relations, class_name: 'NicoTagRelation', |
|
|
|
foreign_key: :tag_id, |
|
|
|
dependent: :destroy |
|
|
|
has_many :reversed_nico_tag_relations, |
|
|
|
class_name: 'NicoTagRelation', foreign_key: :tag_id, dependent: :destroy |
|
|
|
has_many :linked_nico_tags, through: :reversed_nico_tag_relations, source: :nico_tag |
|
|
|
|
|
|
|
has_many :tag_implications, foreign_key: :parent_tag_id, dependent: :destroy |
|
|
|
has_many :children, through: :tag_implications, source: :tag |
|
|
|
|
|
|
|
has_many :reversed_tag_implications, class_name: 'TagImplication', |
|
|
|
foreign_key: :tag_id, |
|
|
|
dependent: :destroy |
|
|
|
has_many :reversed_tag_implications, |
|
|
|
class_name: 'TagImplication', foreign_key: :tag_id, dependent: :destroy |
|
|
|
has_many :parents, through: :reversed_tag_implications, source: :parent_tag |
|
|
|
|
|
|
|
belongs_to :tag_name |
|
|
|
delegate :name, to: :tag_name, allow_nil: true |
|
|
|
validates :tag_name, presence: true |
|
|
|
|
|
|
|
enum :category, { deerjikist: 'deerjikist', |
|
|
|
meme: 'meme', |
|
|
|
character: 'character', |
|
|
|
general: 'general', |
|
|
|
material: 'material', |
|
|
|
nico: 'nico', |
|
|
|
meta: 'meta' } |
|
|
|
enum :category, deerjikist: 'deerjikist', |
|
|
|
meme: 'meme', |
|
|
|
character: 'character', |
|
|
|
general: 'general', |
|
|
|
material: 'material', |
|
|
|
nico: 'nico', |
|
|
|
meta: 'meta' |
|
|
|
|
|
|
|
validates :category, presence: true, inclusion: { in: Tag.categories.keys } |
|
|
|
|
|
|
|
validate :nico_tag_name_must_start_with_nico |
|
|
|
validate :tag_name_must_be_canonical |
|
|
|
|
|
|
|
scope :nico_tags, -> { where(category: :nico) } |
|
|
|
|
|
|
|
CATEGORY_PREFIXES = { |
|
|
|
'gen:' => 'general', |
|
|
|
'djk:' => 'deerjikist', |
|
|
|
'meme:' => 'meme', |
|
|
|
'chr:' => 'character', |
|
|
|
'mtr:' => 'material', |
|
|
|
'meta:' => 'meta' }.freeze |
|
|
|
'gen:' => :general, |
|
|
|
'djk:' => :deerjikist, |
|
|
|
'meme:' => :meme, |
|
|
|
'chr:' => :character, |
|
|
|
'mtr:' => :material, |
|
|
|
'meta:' => :meta }.freeze |
|
|
|
|
|
|
|
def name= val |
|
|
|
(self.tag_name ||= build_tag_name).name = val |
|
|
|
@@ -60,11 +58,11 @@ class Tag < ApplicationRecord |
|
|
|
end |
|
|
|
|
|
|
|
def self.tagme |
|
|
|
@tagme ||= find_or_create_by_tag_name!('タグ希望', category: 'meta') |
|
|
|
@tagme ||= find_or_create_by_tag_name!('タグ希望', category: :meta) |
|
|
|
end |
|
|
|
|
|
|
|
def self.bot |
|
|
|
@bot ||= find_or_create_by_tag_name!('bot操作', category: 'meta') |
|
|
|
@bot ||= find_or_create_by_tag_name!('bot操作', category: :meta) |
|
|
|
end |
|
|
|
|
|
|
|
def self.normalise_tags tag_names, with_tagme: true, deny_nico: true |
|
|
|
@@ -75,7 +73,7 @@ class Tag < ApplicationRecord |
|
|
|
tags = tag_names.map do |name| |
|
|
|
pf, cat = CATEGORY_PREFIXES.find { |p, _| name.start_with?(p) } || ['', nil] |
|
|
|
name = name.delete_prefix(pf) |
|
|
|
find_or_create_by_tag_name!(name, category: (cat || 'general')).tap do |tag| |
|
|
|
find_or_create_by_tag_name!(name, category: (cat || :general)).tap do |tag| |
|
|
|
if cat && tag.category != cat |
|
|
|
tag.update!(category: cat) |
|
|
|
end |
|
|
|
@@ -127,4 +125,10 @@ class Tag < ApplicationRecord |
|
|
|
errors.add :name, 'ニコニコ・タグの命名規則に反してゐます.' |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
def tag_name_must_be_canonical |
|
|
|
if tag_name&.canonical_id |
|
|
|
errors.add :tag_name, 'tag_names へは実体を示す必要があります.' |
|
|
|
end |
|
|
|
end |
|
|
|
end |