皆さん、こんにちは。
セルフホストユーザーとして、最近「デジタルOCD(強迫性障害)」に悩まされています。初期テスト期間中に削除したカテゴリやタグがあり、データベースにギャップを残すのではなく、これらのクリーンな1桁のID(例:カテゴリID 2やタグID 3)を回収したくてたまらなかったのです。
UIではこれに対応していないことはわかっていますので、Railsコンソール(./launcher enter app → rails c)に入って、手動で状況を復元しました。現在フロントエンドでは見た目も動作も完璧ですが、ここでデータベースに詳しい方々が、この作業に隠れた危険や長期的な地雷(問題)がないか見てほしいと思っています。
私が実行した正確で詳細なワークフローは以下の通りです:
1. 削除されたカテゴリを元のIDと完全な属性で再作成:
IDを強制するだけでなく、レコードが完全になるよう必須の属性を指定しました。
Ruby
Category.create!(
id: 2,
name: "Site Feedback",
color: "0088CC",
text_color: "FFFFFF",
user_id: -1 # システムユーザー
)
2. 元のトピックを復元し、カテゴリの説明としてリンクする:
Ruby
Topic.with_deleted.find(1).recover!
Category.find(2).update!(topic_id: 1)
3. トピックのサブタイプを整理(バニラデフォルトに戻す):
他のデフォルトカテゴリを確認したところ、その説明トピックは単に nil を使用していることに気づいたので、ファクトリ状態に戻しました。
Ruby
Topic.find(1).update!(subtype: nil)
4. IDのギャップを埋めるために古いタグを一括再作成:
Ruby
Tag.create!([
{ id: 3, name: "private-school" },
{ id: 7, name: "tennis" }
])
私の主な質問:
これをやる実用的な必要性が自分自身のOCDを満たすこと以外にないことは完全に理解しています。しかし、構造の観点から厳密に言えば、.update! や .create! のような基本的なActiveRecordメソッドは、必要なDiscourseのコールバック(検索インデックス作成、Redisキャッシュ更新、Sidekiqジョブ、ルーティングなど)をすべて安全にトリガーするのでしょうか?それとも、将来のスキーママイグレーションを壊しかねない重要な内部ロジックを意図せずバイパスしてしまったのでしょうか?
私の好奇心を満たしてくれてありがとうございます!