当社のフォーラムでは、商業ウェブ開発クライアントを巡るスレッドが300件以上の投稿を含み、長期間にわたって議論されていました。しかし、いくつかの投稿を別のスレッドに移動させた直後、数日前にそのスレッド全体が何らかの理由で消滅してしまいました。
ユーザーアクティビティログを確認したところ、その「消失」したスレッドが削除または編集されたという記録は一切ありませんでした。記録に残っていたのは、約10件の投稿が新しいスレッドに移動されたという行為のみでした。
本日、Discourse のデータベースを確認したところ、306件の投稿はすべて存在していることがわかりました。しかし、それらの投稿に含まれる topic_id を確認すると、該当する topic_id を持つスレッドは空の配列 [] として表示されました。
仮に、消失したスレッドの記録が post レコード上で topic_id “300000” だったとします。
コンソールで以下を実行した結果は次の通りでした:
> Topic.with_deleted.where(id: 300000)
> []
> Post.where(topic_id:300000).count
> 306
これら306件の投稿を新しいスレッドに復元しました。Discourse UI で「ダミー」(プレースホルダー)スレッドを作成し、その後に「孤立」した投稿の topic_id をすべて新しいプレースホルダースレッドの ID に変更しました。
新しいスレッド(ダミースレッド)の ID が 304000 だった場合、以下のようになります:
Post.where(topic_id: 300000).update_all(topic_id: 304000)
この操作は成功し、306件の投稿すべてが新しいプレースホルダー/ダミースレッドの ID に正常に復元されました。
その後、新しいスレッドのタイトルを編集しただけで、すべてが正常に機能するようになりました。また、この長い非公開スレッドへのリンクが他に存在しなかったため、新しいスレッド ID に変更してもリンクが切れる心配はありませんでした。
なぜスレッドの記録が空になり、その topic_id を持つすべての投稿が無事残っていたのか、私にはわかりません。記録やログには、そのスレッドに対する削除や編集などのアクションは一切表示されていませんでした。そのスレッドに対して行われたのは、いくつかの投稿を新しいスレッドに移動させる行為のみでしたが、それによってスレッドの記録が「無効化」されるはずはありません。
この現象を再現することができず(また何が起こったのかも不明なため)、バグとして報告することはしませんでした。代わりに、今日時間のあるときに調査を行い、306件の投稿が親スレッドを失っていたことを確認し、この手法ですべてを復元することができました。
もし元の topic_id を維持したかった場合、元のスレッド記録を復元しようとしたかもしれませんが、それはもう少し手間がかかる作業のようです。そのため、単に306件の「スレッドを持たない」投稿を新しいスレッドに割り当てました。その結果、期待通り以下となりました:
> Post.where(topic_id:304000).count
> 307
将来、同様の状況に遭遇する方の参考になれば幸いです。