208 行
8.1 KiB
Ruby
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
|