This commit is contained in:
2026-04-19 17:14:47 +09:00
parent 86de85ad91
commit f3a2b08359
16 changed files with 320 additions and 81 deletions
+5 -1
View File
@@ -1,7 +1,11 @@
module MyDiscard
extend ActiveSupport::Concern
included { include Discard::Model }
included do
include Discard::Model
default_scope -> { kept }
end
class_methods do
def find_undiscard_or_create_by! attrs, &block
+1 -17
View File
@@ -1,29 +1,13 @@
class PostVersion < ApplicationRecord
before_update do
raise ActiveRecord::ReadOnlyRecord, '版は更新できません.'
end
before_destroy do
raise ActiveRecord::ReadOnlyRecord, '版は削除できません.'
end
include VersionRecord
belongs_to :post
belongs_to :parent, class_name: 'Post', optional: true
belongs_to :created_by_user, class_name: 'User', optional: true
enum :event_type, { create: 'create',
update: 'update',
discard: 'discard',
restore: 'restore' }, prefix: true, validate: true
validates :version_no, presence: true, numericality: { only_integer: true, greater_than: 0 }
validates :event_type, presence: true, inclusion: { in: event_types.keys }
validates :url, presence: true
validate :validate_original_created_range
scope :chronological, -> { order(:version_no, :id) }
private
def validate_original_created_range
+18 -5
View File
@@ -8,8 +8,6 @@ class Tag < ApplicationRecord
;
end
default_scope -> { kept }
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'
@@ -36,6 +34,9 @@ class Tag < ApplicationRecord
has_many :deerjikists, dependent: :delete_all
has_many :materials
has_many :tag_versions
has_many :nico_tag_versions
belongs_to :tag_name
delegate :wiki_page, to: :tag_name
@@ -152,10 +153,11 @@ class Tag < ApplicationRecord
retry
end
def self.merge_tags! target_tag, source_tags
def self.merge_tags! target_tag, source_tags, created_by_user: nil
target_tag => Tag
affected_post_ids = Set.new
affected_tag_ids = Set.new
Tag.transaction do
Array(source_tags).compact.uniq.each do |source_tag|
@@ -166,7 +168,7 @@ class Tag < ApplicationRecord
source_tag.post_tags.kept.find_each do |source_pt|
post_id = source_pt.post_id
affected_post_ids << post_id
source_pt.discard_by!(nil)
source_pt.discard_by!(created_by_user)
unless PostTag.kept.exists?(post_id:, tag: target_tag)
PostTag.create!(post_id:, tag: target_tag)
end
@@ -179,6 +181,7 @@ class Tag < ApplicationRecord
end
source_tag.discard!
record_tag_discard!(source_tag, current_by_user: nil)
if source_tag.nico?
source_tag_name.discard!
@@ -186,10 +189,12 @@ class Tag < ApplicationRecord
source_tag_name.update_columns(canonical_id: target_tag.tag_name_id,
updated_at: Time.current)
end
record_tag_version!(target_tag, event_type: :update, created_by_user: nil)
end
Post.where(id: affected_post_ids.to_a).find_each do |post|
PostVersionRecorder.record!(post:, event_type: :update, created_by_user: nil)
PostVersionRecorder.record!(post:, event_type: :update, created_by_user:)
end
# 投稿件数を再集計
@@ -199,6 +204,14 @@ class Tag < ApplicationRecord
target_tag.reload
end
def snapshot_aliases = tag_name.aliases.kept.order(:name).pluck(:name)
def snapshot_parent_tag_ids = parents.order('id').pluck('id')
def snapshot_linked_tags
linked_tags.joins(:tag_name).order('tag_names.name').pluck('tag_names.name')
end
private
def nico_tag_name_must_start_with_nico
+16
View File
@@ -0,0 +1,16 @@
class TagVersion < ApplicationRecord
include VersionRecord
belongs_to :tag
enum :category, { deerjikist: 'deerjikist',
meme: 'meme',
character: 'character',
general: 'general',
material: 'material',
meta: 'meta',
nico: 'nico' }, validate: true
validates :name, presence: true
validates :category, presence: true
end
+19
View File
@@ -0,0 +1,19 @@
module VersionRecord
extend ActiveSupport::Concern
def readonly? = persisted?
included do
belongs_to :created_by_user, class_name: 'User', optional: true
enum :event_type, { create: 'create',
update: 'update',
discard: 'discard',
restore: 'restore' }, prefix: true, validate: true
validates :version_no, presence: true, numericality: { only_integer: true, greater_than: 0 }
validates :event_type, presence: true
scope :chronological, -> { order(:version_no, :id) }
end
end