恢复已被删除的长主题

在我们的论坛上,曾有一个包含超过 300 条回复的长篇主题,涉及一位商业网站开发客户。不知何故,在将几条回复移动到另一个主题后,该主题在几天前突然消失了。

我检查了用户活动日志,但记录中没有任何关于该“失踪”主题被删除或编辑的条目。唯一的操作是将大约 10 条回复移动到了一个新主题。

今天,我检查了 Discourse 数据库,发现所有 306 条回复都还在,但当我查看这些回复中的 topic_id 时,对应的主题却是空的: []

假设失踪的主题记录在回复记录中的 topic_id 为 “300000”。

我在控制台中执行了以下操作,结果如下:

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

我通过 Discourse UI 创建了一个“虚拟”(占位符)主题,然后将所有“孤儿”回复的 topic_id 更改为新的占位符主题 ID,从而恢复了这 306 条回复。具体操作如下:

假设新创建的主题(虚拟主题)的 ID 为 304000,则执行:

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

此操作成功将 306 条回复恢复到了新的占位符/虚拟主题 ID 下。

随后,我只需编辑新主题的标题,一切便恢复正常。由于我们没有任何指向该长篇私有主题的链接,因此无需担心因新主题 ID 而破坏链接,一切顺利。

我完全不明白为什么主题记录会变成空,而所有带有该 topic_id 的回复却完好无损。记录和日志均未显示对该主题有任何操作(删除或编辑)。对该主题的唯一操作是将少量回复移动到了一个新主题,但这本不应导致主题记录被“置空”。

由于无法复现此问题(也不确定具体原因),我没有将其作为“错误”报告,而是等到今天有时间后进行了调查,发现这 306 条回复失去了它们的父主题“所有者”;但通过上述方法成功恢复了它们。

如果我想保留原始主题 ID,我会尝试恢复原始主题记录,但这似乎需要更多工作;因此,我只是将这 306 条“无主题”的回复分配给了一个新主题,结果正如预期:

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

希望这能帮助未来可能遇到类似情况的人。

2 个赞