Восстановить удалённую длинную тему

На нашем форуме была длинная тема с более чем 300 сообщениями, касающаяся коммерческого клиента веб-разработки. По какой-то причине эта тема полностью исчезла несколько дней назад после перемещения нескольких сообщений в другую тему.

Я проверил журнал активности пользователей, и в нём не было записей о том, что эта «пропавшая» тема была удалена или отредактирована. Единственным действием было перемещение нескольких сообщений (около 10) в новую тему.

Сегодня я проверил базу данных Discourse и обнаружил, что все 306 сообщений на месте, но при проверке topic_id в этих сообщениях тема с этим идентификатором оказалась пустой: [].

Предположим, что запись пропавшей темы имела topic_id «300000» в записях сообщений.

Когда я выполнил это в консоли, результат был следующим:

> Topic.with_deleted.where(id: 300000)
> []
> Post.where(topic_id:300000).count
> 306

Я восстановил все эти 306 сообщений в новую тему, создав «фиктивную» (заглушку) тему в интерфейсе Discourse, а затем изменил все topic_id «сиротских» сообщений на новый идентификатор темы-заглушки, как показано ниже:

Допустим, созданная новая тема (фиктивная тема) имеет id: 304000, тогда:

Post.where(topic_id: 300000).update_all(topic_id: 304000)

Это сработало, и все 306 сообщений были восстановлены в новую тему-заглушку/фиктивную тему.

Затем я просто отредактировал заголовок новой темы, и всё выглядит отлично. Поскольку у нас не было никаких ссылок на эту длинную частную тему, не было необходимости беспокоиться о том, что новые ссылки могут сломаться из-за нового topic_id, так что всё в порядке.

Я не понимаю, почему запись темы оказалась пустой, а все сообщения с этим topic_id остались нетронутыми. Записи и логи не показывают никаких действий (удаление, редактирование) над этой темой. Единственным действием над этой темой было перемещение нескольких сообщений в новую тему, но это не должно было «обнулить» запись темы.

Поскольку я не могу воспроизвести эту ситуацию (и не уверен, что именно произошло), я не стал сообщать об этом как об «ошибке», а вместо этого просто ждал, пока у меня появится время сегодня, провёл небольшое исследование и обнаружил, что 306 сообщений потеряли свою родительскую тему «кто-то»; но этот метод позволил восстановить их все.

Если бы я хотел сохранить исходный topic_id, я бы попытался восстановить исходную запись темы, но это, кажется, требует немного больше работы; поэтому я просто назначил 306 «безтемовых» сообщений новой теме, и результат, как и ожидалось:

> Post.where(topic_id:304000).count
> 307

Надеюсь, это поможет тем, кто может столкнуться с подобной ситуацией в будущем.

2 лайка