ファイル
btrc-hub/backend/db/migrate/20261102010000_backfill_events_from_existing_versions.rb
T
2026-11-03 12:22:15 +09:00

208 行
8.1 KiB
Ruby

class BackfillEventsFromExistingVersions < ActiveRecord::Migration[8.0]
class MigrationEvent < ActiveRecord::Base
self.table_name = 'events'
end
class MigrationPostVersion < ActiveRecord::Base
self.table_name = 'post_versions'
end
class MigrationTagVersion < ActiveRecord::Base
self.table_name = 'tag_versions'
end
class MigrationMaterialVersion < ActiveRecord::Base
self.table_name = 'material_versions'
end
class MigrationTagDescriptionVersion < ActiveRecord::Base
self.table_name = 'tag_description_versions'
end
class MigrationTagGroupVersion < ActiveRecord::Base
self.table_name = 'tag_group_versions'
end
class MigrationLocale < ActiveRecord::Base
self.table_name = 'locales'
end
def up
# create → posts.create
# update → posts.update
raise if MigrationPostVersion.where.not(event_type: ['create', 'update']).exists?
# create → materials.create
# update → materials.update
if MigrationMaterialVersion.where.not(event_type: ['create', 'update']).exists?
raise
end
# create → posts.create / posts.update / materials.create / materials.update / unknown
# update → tags.update / locales.create
# discard → unknown
if MigrationTagVersion.where.not(event_type: ['create', 'update', 'discard']).exists?
raise
end
# create → tag_descriptions.create
# update → tag_descriptions.update
if MigrationTagDescriptionVersion.where.not(event_type: ['create', 'update']).exists?
raise
end
# create → tag_groups.create
# update → tag_groups.update
if MigrationTagGroupVersion.where.not(event_type: ['create', 'update']).exists?
raise
end
# post_versions の Backfill
MigrationPostVersion.find_each do |pv|
ev = MigrationEvent.create!(event_type: "posts.#{ pv.event_type }",
reason: nil,
reverted_from_event_id: nil,
metadata: nil,
ip_address: nil,
created_by_user_id: pv.created_by_user_id,
created_at: pv.created_at)
pv.update_columns(event_id: ev.id)
end
# material_versions の Backfill
MigrationMaterialVersion.find_each do |m|
ev = MigrationEvent.create!(event_type: "materials.#{ m.event_type }",
reason: nil,
reverted_from_event_id: nil,
metadata: nil,
ip_address: nil,
created_by_user_id: m.created_by_user_id,
created_at: m.created_at)
m.update_columns(event_id: ev.id)
end
# ロカール追加に伴ふ該当語言のタグ名称追加異動のみ分離
ids_cause_of_locale_creation = []
MigrationLocale.where('created_at > ?', MigrationLocale.minimum(:created_at)).find_each do |l|
ev = MigrationEvent.create!(event_type: 'locales.create',
reason: nil,
reverted_from_event_id: nil,
metadata: nil,
ip_address: nil,
created_by_user_id: nil,
created_at: l.created_at)
MigrationTagVersion
.where('created_at > ?', l.created_at)
.where(event_type: 'update', event_id: nil)
.find_each do |t|
next unless t.names.key?(l.language_code)
prev = MigrationTagVersion.find_by(tag_id: t.tag_id, version_no: t.version_no - 1)
next if prev.nil? || prev.names.key?(l.language_code)
t.update_columns(event_id: ev.id)
ids_cause_of_locale_creation << t.id
end
ev.destroy! unless MigrationTagVersion.where(event_id: ev.id).exists?
end
# tag_versions の Backfill
MigrationTagVersion.where.not(id: ids_cause_of_locale_creation).find_each do |t|
ev =
case t.event_type
when 'create'
post =
MigrationPostVersion
.where('JSON_CONTAINS(tags_json, ?) <> 0', { tag_id: t.tag_id }.to_json)
.find_by(created_at: MigrationPostVersion
.where('JSON_CONTAINS(tags_json, ?) <> 0',
{ tag_id: t.tag_id }.to_json)
.minimum(:created_at))
material =
MigrationMaterialVersion
.where(tag_id: t.tag_id)
.find_by(created_at: MigrationMaterialVersion
.where(tag_id: t.tag_id)
.minimum(:created_at))
if post
if material
if post.created_at < material.created_at
MigrationEvent.find(post.event_id)
else
MigrationEvent.find(material.event_id)
end
else
MigrationEvent.find(post.event_id)
end
else
if material
MigrationEvent.find(material.event_id)
else
MigrationEvent.create!(event_type: 'unknown',
reason: nil,
reverted_from_event_id: nil,
metadata: nil,
ip_address: nil,
created_by_user_id: t.created_by_user_id,
created_at: t.created_at)
end
end
when 'update'
MigrationEvent.create!(event_type: 'tags.update',
reason: nil,
reverted_from_event_id: nil,
metadata: nil,
ip_address: nil,
created_by_user_id: t.created_by_user_id,
created_at: t.created_at)
when 'discard'
MigrationEvent.create!(event_type: 'unknown',
reason: nil,
reverted_from_event_id: nil,
metadata: nil,
ip_address: nil,
created_by_user_id: t.created_by_user_id,
created_at: t.created_at)
end
t.update_columns(event_id: ev.id)
end
# tag_description_versions の Backfill
MigrationTagDescriptionVersion.find_each do |td|
ev = MigrationEvent.create!(event_type: "tag_descriptions.#{ td.event_type }",
reason: nil,
reverted_from_event_id: nil,
metadata: nil,
ip_address: nil,
created_by_user_id: td.created_by_user_id,
created_at: td.created_at)
td.update_columns(event_id: ev.id)
end
# tag_group_versions の Backfill
MigrationTagGroupVersion.find_each do |tg|
ev = MigrationEvent.create!(event_type: "tag_groups.#{ tg.event_type }",
reason: nil,
reverted_from_event_id: nil,
metadata: nil,
ip_address: nil,
created_by_user_id: tg.created_by_user_id,
created_at: tg.created_at)
tg.update_columns(event_id: ev.id)
end
change_column_null :post_versions, :event_id, false
change_column_null :tag_versions, :event_id, false
change_column_null :material_versions, :event_id, false
change_column_null :tag_description_versions, :event_id, false
change_column_null :tag_group_versions, :event_id, false
end
def down
raise ActiveRecord::IrreversibleMigration, '戻せません.'
end
end