Reviewed-on: #423 Co-authored-by: miteruzo <miteruzo@naver.com>
このコミットはプルリクエスト #423 でマージされました。
このコミットが含まれているのは:
@@ -0,0 +1,63 @@
|
||||
class CreateTagDescriptions < ActiveRecord::Migration[8.0]
|
||||
def change
|
||||
create_table :tag_description_versions do |t|
|
||||
t.references :tag, null: false, foreign_key: false
|
||||
t.string :language_code, limit: 16, null: false
|
||||
t.integer :version_no, null: false
|
||||
t.string :event_type, null: false
|
||||
t.text :body, null: false
|
||||
t.string :source_language_code, limit: 16
|
||||
t.integer :source_version_no
|
||||
t.references :created_by_user
|
||||
t.datetime :created_at, null: false
|
||||
|
||||
t.index [:tag_id, :language_code, :version_no], unique: true
|
||||
t.foreign_key :tag_description_versions,
|
||||
column: [:tag_id, :source_language_code, :source_version_no],
|
||||
primary_key: [:tag_id, :language_code, :version_no]
|
||||
|
||||
t.check_constraint 'version_no > 0',
|
||||
name: 'chk_tag_description_versions_version_no_positive'
|
||||
|
||||
t.check_constraint "event_type IN ('create', 'update', 'discard', 'restore')",
|
||||
name: 'tag_description_versions_event_type_valid'
|
||||
|
||||
t.check_constraint ('(source_language_code IS NULL AND source_version_no IS NULL) OR ' +
|
||||
'(source_language_code IS NOT NULL AND source_version_no IS NOT NULL)'),
|
||||
name: 'chk_tag_description_versions_source_pair'
|
||||
|
||||
t.check_constraint 'source_language_code IS NULL OR source_language_code <> language_code',
|
||||
name: 'chk_tag_description_versions_source_language_code_different'
|
||||
end
|
||||
|
||||
create_table :tag_descriptions do |t|
|
||||
t.references :tag, null: false, foreign_key: true
|
||||
t.string :language_code, limit: 16, null: false, index: true
|
||||
t.integer :version_no, null: false
|
||||
t.text :body, null: false
|
||||
t.string :source_language_code, limit: 16
|
||||
t.integer :source_version_no
|
||||
t.references :created_by_user, foreign_key: { to_table: :users }
|
||||
t.references :updated_by_user, foreign_key: { to_table: :users }
|
||||
t.timestamps
|
||||
|
||||
t.foreign_key :languages, column: :language_code, primary_key: :code
|
||||
t.foreign_key :tag_description_versions,
|
||||
column: [:tag_id, :source_language_code, :source_version_no],
|
||||
primary_key: [:tag_id, :language_code, :version_no]
|
||||
|
||||
t.index [:tag_id, :language_code], unique: true
|
||||
t.index [:source_language_code, :source_version_no]
|
||||
|
||||
t.check_constraint 'version_no > 0',
|
||||
name: 'chk_tag_descriptions_version_no_positive'
|
||||
|
||||
t.check_constraint ('(source_language_code IS NULL AND source_version_no IS NULL) OR ' +
|
||||
'(source_language_code IS NOT NULL AND source_version_no IS NOT NULL)'),
|
||||
name: 'chk_tag_descriptions_source_pair'
|
||||
|
||||
t.check_constraint 'source_language_code IS NULL OR source_language_code <> language_code',
|
||||
name: 'chk_tag_descriptions_source_language_code_different'
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,104 @@
|
||||
class MigrateTagDescriptionsFromWikiPages < ActiveRecord::Migration[8.0]
|
||||
class WikiPage < ActiveRecord::Base
|
||||
self.table_name = 'wiki_pages'
|
||||
end
|
||||
|
||||
class WikiRevision < ActiveRecord::Base
|
||||
self.table_name = 'wiki_revisions'
|
||||
end
|
||||
|
||||
class WikiRevisionLine < ActiveRecord::Base
|
||||
self.table_name = 'wiki_revision_lines'
|
||||
end
|
||||
|
||||
class TagName < ActiveRecord::Base
|
||||
self.table_name = 'tag_names'
|
||||
end
|
||||
|
||||
class TagDescription < ActiveRecord::Base
|
||||
self.table_name = 'tag_descriptions'
|
||||
end
|
||||
|
||||
class TagDescriptionVersion < ActiveRecord::Base
|
||||
self.table_name = 'tag_description_versions'
|
||||
end
|
||||
|
||||
def up
|
||||
WikiPage.find_each do |page|
|
||||
tag_name = TagName.find_by(id: page.tag_name_id, language_code: 'ja')
|
||||
next unless tag_name&.tag_id
|
||||
|
||||
revisions = WikiRevision.where(wiki_page_id: page.id).order(:id).to_a
|
||||
|
||||
revisions.each_with_index do |revision, index|
|
||||
version_no = index + 1
|
||||
|
||||
tag_id = tag_name[:tag_id]
|
||||
|
||||
unless tag_id
|
||||
raise (
|
||||
'tag_id is nil: ' +
|
||||
"wiki_page_id=#{ page.id }, " +
|
||||
"tag_name_id=#{ tag_name.id }, " +
|
||||
"tag_name=#{ tag_name.attributes.inspect}")
|
||||
end
|
||||
|
||||
revision_id = revision.id
|
||||
|
||||
say (
|
||||
"wiki_page_id=#{ page.id }, " +
|
||||
"tag_name_id=#{ tag_name.id }, " +
|
||||
"tag_id=#{ tag_id }, " +
|
||||
"revision_id=#{ revision_id }")
|
||||
|
||||
version = TagDescriptionVersion.new(
|
||||
id: revision_id,
|
||||
tag_id:,
|
||||
language_code: 'ja',
|
||||
version_no:,
|
||||
event_type: version_no == 1 ? 'create' : 'update',
|
||||
body: revision_body(revision_id),
|
||||
source_language_code: nil,
|
||||
source_version_no: nil,
|
||||
created_by_user_id: revision.created_user_id,
|
||||
created_at: revision.created_at)
|
||||
|
||||
say version.attributes.inspect
|
||||
|
||||
version.save!
|
||||
end
|
||||
|
||||
next if page.discarded_at.present?
|
||||
next if revisions.empty?
|
||||
|
||||
TagDescription.create!(
|
||||
id: page.id,
|
||||
tag_id: tag_name.tag_id,
|
||||
language_code: 'ja',
|
||||
version_no: revisions.length,
|
||||
body: page.body,
|
||||
source_language_code: nil,
|
||||
source_version_no: nil,
|
||||
created_by_user_id: page.created_user_id,
|
||||
updated_by_user_id: page.updated_user_id,
|
||||
created_at: page.created_at,
|
||||
updated_at: page.updated_at)
|
||||
end
|
||||
end
|
||||
|
||||
def down
|
||||
raise ActiveRecord::IrreversibleMigration, '戻せません.'
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def revision_body revision_id
|
||||
WikiRevisionLine
|
||||
.joins('INNER JOIN wiki_lines ' +
|
||||
'ON wiki_lines.id = wiki_revision_lines.wiki_line_id')
|
||||
.where(wiki_revision_id: revision_id)
|
||||
.order(:position)
|
||||
.pluck('wiki_lines.body')
|
||||
.join("\n")
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,53 @@
|
||||
class RepairWikiUpdatedAt < ActiveRecord::Migration[8.0]
|
||||
class WikiPage < ActiveRecord::Base
|
||||
self.table_name = 'wiki_pages'
|
||||
end
|
||||
|
||||
class WikiVersion < ActiveRecord::Base
|
||||
self.table_name = 'wiki_versions'
|
||||
end
|
||||
|
||||
class TagDescription < ActiveRecord::Base
|
||||
self.table_name = 'tag_descriptions'
|
||||
end
|
||||
|
||||
class TagDescriptionVersion < ActiveRecord::Base
|
||||
self.table_name = 'tag_description_versions'
|
||||
end
|
||||
|
||||
def up
|
||||
say_with_time 'Repairing wiki_pages.updated_at from wiki_versions' do
|
||||
WikiPage.find_each do |page|
|
||||
version =
|
||||
WikiVersion
|
||||
.where(wiki_page_id: page.id)
|
||||
.order(version_no: :desc)
|
||||
.first
|
||||
|
||||
next unless version
|
||||
|
||||
page.update_columns(updated_at: version.created_at)
|
||||
end
|
||||
end
|
||||
|
||||
say_with_time 'Repairing tag_descriptions.updated_at from tag_description_versions' do
|
||||
TagDescription.find_each do |description|
|
||||
version =
|
||||
TagDescriptionVersion
|
||||
.where(
|
||||
tag_id: description.tag_id,
|
||||
language_code: description.language_code)
|
||||
.order(version_no: :desc)
|
||||
.first
|
||||
|
||||
next unless version
|
||||
|
||||
description.update_columns(updated_at: version.created_at)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def down
|
||||
;
|
||||
end
|
||||
end
|
||||
生成ファイル
+50
-17
@@ -10,7 +10,7 @@
|
||||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema[8.0].define(version: 2026_09_22_040000) do
|
||||
ActiveRecord::Schema[8.0].define(version: 2026_10_05_000000) do
|
||||
create_table "active_storage_attachments", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
|
||||
t.string "name", null: false
|
||||
t.string "record_type", null: false
|
||||
@@ -440,6 +440,49 @@ ActiveRecord::Schema[8.0].define(version: 2026_09_22_040000) do
|
||||
t.index ["user_id"], name: "index_settings_on_user_id", unique: true
|
||||
end
|
||||
|
||||
create_table "tag_description_versions", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
|
||||
t.bigint "tag_id", null: false
|
||||
t.string "language_code", limit: 16, null: false
|
||||
t.integer "version_no", null: false
|
||||
t.string "event_type", null: false
|
||||
t.text "body", null: false
|
||||
t.string "source_language_code", limit: 16
|
||||
t.integer "source_version_no"
|
||||
t.bigint "created_by_user_id"
|
||||
t.datetime "created_at", null: false
|
||||
t.index ["created_by_user_id"], name: "index_tag_description_versions_on_created_by_user_id"
|
||||
t.index ["tag_id", "language_code", "version_no"], name: "idx_on_tag_id_language_code_version_no_ced77e57e6", unique: true
|
||||
t.index ["tag_id", "source_language_code", "source_version_no"], name: "fk_rails_4f13094dbc"
|
||||
t.index ["tag_id"], name: "index_tag_description_versions_on_tag_id"
|
||||
t.check_constraint "((`source_language_code` is null) and (`source_version_no` is null)) or ((`source_language_code` is not null) and (`source_version_no` is not null))", name: "chk_tag_description_versions_source_pair"
|
||||
t.check_constraint "(`source_language_code` is null) or (`source_language_code` <> `language_code`)", name: "chk_tag_description_versions_source_language_code_different"
|
||||
t.check_constraint "`event_type` in (_utf8mb4'create',_utf8mb4'update',_utf8mb4'discard',_utf8mb4'restore')", name: "tag_description_versions_event_type_valid"
|
||||
t.check_constraint "`version_no` > 0", name: "chk_tag_description_versions_version_no_positive"
|
||||
end
|
||||
|
||||
create_table "tag_descriptions", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
|
||||
t.bigint "tag_id", null: false
|
||||
t.string "language_code", limit: 16, null: false
|
||||
t.integer "version_no", null: false
|
||||
t.text "body", null: false
|
||||
t.string "source_language_code", limit: 16
|
||||
t.integer "source_version_no"
|
||||
t.bigint "created_by_user_id"
|
||||
t.bigint "updated_by_user_id"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.index ["created_by_user_id"], name: "index_tag_descriptions_on_created_by_user_id"
|
||||
t.index ["language_code"], name: "index_tag_descriptions_on_language_code"
|
||||
t.index ["source_language_code", "source_version_no"], name: "idx_on_source_language_code_source_version_no_00117fe02a"
|
||||
t.index ["tag_id", "language_code"], name: "index_tag_descriptions_on_tag_id_and_language_code", unique: true
|
||||
t.index ["tag_id", "source_language_code", "source_version_no"], name: "fk_rails_d1be0a7696"
|
||||
t.index ["tag_id"], name: "index_tag_descriptions_on_tag_id"
|
||||
t.index ["updated_by_user_id"], name: "index_tag_descriptions_on_updated_by_user_id"
|
||||
t.check_constraint "((`source_language_code` is null) and (`source_version_no` is null)) or ((`source_language_code` is not null) and (`source_version_no` is not null))", name: "chk_tag_descriptions_source_pair"
|
||||
t.check_constraint "(`source_language_code` is null) or (`source_language_code` <> `language_code`)", name: "chk_tag_descriptions_source_language_code_different"
|
||||
t.check_constraint "`version_no` > 0", name: "chk_tag_descriptions_version_no_positive"
|
||||
end
|
||||
|
||||
create_table "tag_implications", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
|
||||
t.bigint "tag_id", null: false
|
||||
t.bigint "parent_tag_id", null: false
|
||||
@@ -656,19 +699,6 @@ ActiveRecord::Schema[8.0].define(version: 2026_09_22_040000) do
|
||||
t.index ["banned_at"], name: "index_users_on_banned_at"
|
||||
end
|
||||
|
||||
create_table "wiki_assets", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
|
||||
t.bigint "wiki_page_id", null: false
|
||||
t.integer "no", null: false
|
||||
t.string "alt_text"
|
||||
t.binary "sha256", limit: 32, null: false
|
||||
t.bigint "created_by_user_id", null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.index ["created_by_user_id"], name: "index_wiki_assets_on_created_by_user_id"
|
||||
t.index ["wiki_page_id", "no"], name: "index_wiki_assets_on_wiki_page_id_and_no", unique: true
|
||||
t.index ["wiki_page_id", "sha256"], name: "index_wiki_assets_on_wiki_page_id_and_sha256", unique: true
|
||||
end
|
||||
|
||||
create_table "wiki_lines", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
|
||||
t.string "sha256", limit: 64, null: false
|
||||
t.text "body", null: false
|
||||
@@ -685,7 +715,6 @@ ActiveRecord::Schema[8.0].define(version: 2026_09_22_040000) do
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.datetime "discarded_at"
|
||||
t.integer "next_asset_no", default: 1, null: false
|
||||
t.integer "version_no", null: false
|
||||
t.index ["created_user_id"], name: "index_wiki_pages_on_created_user_id"
|
||||
t.index ["discarded_at"], name: "index_wiki_pages_on_discarded_at"
|
||||
@@ -788,6 +817,12 @@ ActiveRecord::Schema[8.0].define(version: 2026_09_22_040000) do
|
||||
add_foreign_key "post_versions", "users", column: "created_by_user_id"
|
||||
add_foreign_key "posts", "users", column: "uploaded_user_id"
|
||||
add_foreign_key "settings", "users"
|
||||
add_foreign_key "tag_description_versions", "tag_description_versions", column: ["tag_id", "source_language_code", "source_version_no"], primary_key: ["tag_id", "language_code", "version_no"]
|
||||
add_foreign_key "tag_descriptions", "languages", column: "language_code", primary_key: "code"
|
||||
add_foreign_key "tag_descriptions", "tag_description_versions", column: ["tag_id", "source_language_code", "source_version_no"], primary_key: ["tag_id", "language_code", "version_no"]
|
||||
add_foreign_key "tag_descriptions", "tags"
|
||||
add_foreign_key "tag_descriptions", "users", column: "created_by_user_id"
|
||||
add_foreign_key "tag_descriptions", "users", column: "updated_by_user_id"
|
||||
add_foreign_key "tag_implications", "tags"
|
||||
add_foreign_key "tag_implications", "tags", column: "parent_tag_id"
|
||||
add_foreign_key "tag_names", "languages", column: "language_code", primary_key: "code"
|
||||
@@ -822,8 +857,6 @@ ActiveRecord::Schema[8.0].define(version: 2026_09_22_040000) do
|
||||
add_foreign_key "user_post_views", "posts"
|
||||
add_foreign_key "user_post_views", "users"
|
||||
add_foreign_key "user_theme_slots", "users"
|
||||
add_foreign_key "wiki_assets", "users", column: "created_by_user_id"
|
||||
add_foreign_key "wiki_assets", "wiki_pages"
|
||||
add_foreign_key "wiki_pages", "tag_names"
|
||||
add_foreign_key "wiki_pages", "users", column: "created_user_id"
|
||||
add_foreign_key "wiki_pages", "users", column: "updated_user_id"
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする