批量永久删除已删除的帖子?

抱歉,如果这是个愚蠢的问题……为什么在 Discourse 中无法轻松从数据库中删除消息?

3 个赞

Discourse 使用一种称为“软删除”的机制,使得纠正错误变得容易。它还允许区分“对其他用户删除”和“对管理员删除”。

此外,它还能维护数据库的完整性。如果一个帖子在被删除之前被引用了怎么办?那么引用该帖子的帖子就会指向一个不再存在的帖子。这可能导致各种错误。

2 个赞

谢谢,现在我明白了……唯一的问题是如果有很多已删除的消息。

1 个赞

此前已多次讨论并提出过此请求,例如:

虽然我理解软删除可能有用,但在一段时间后(例如 1 周或 1 个月),最好能真正删除已删除的内容,以节省空间并确保符合法律要求,例如因为发布了非法内容,或需要移除个人信息以符合 GDPR 规定。

必须登录并运行 rake 任务将消息替换为“此内容已被删除”,这种做法略显简陋。

5 个赞

哎呀……抱歉,我从 phpBB 过来,以为可以这样操作。

1 个赞

现已实现

6 个赞

此致,

但我们该如何做到这一点???

2 个赞

我今天早上一直在尝试这个,但还没弄明白。:slightly_smiling_face: 有什么建议吗?

1 个赞

好的,该设置需要在“管理 > 设置 > 安全”中配置(目前因某种原因被隐藏),然后需要像授予版主权限一样为每位管理员单独授予该权限。

一旦授予,它将会出现在帖子管理菜单中。

3 个赞

啊,那可能是我的障碍。我一直在管理设置中寻找 can_permanently_delete,但没看到它。

1 个赞

由于我们不鼓励使用此功能,因此该站点设置已隐藏。该功能最初是为处理敏感信息被发布的情况而设计的,以便从数据库中彻底清除这些信息。此外,该操作本身并非批量操作。

由于这是一个隐藏的站点设置,启用它的唯一方法是通过控制台。

5 个赞

这几乎完全符合我的需求!谢谢。

我该如何编写语法,使其仅涵盖 xxxx 日期之前删除的所有帖子?

1 个赞

那将是 Post.with_deleted.where("deleted_at < 'YYYY-mm-dd'").update_all(...)

7 个赞

您能告诉我们如何从控制台启用它吗?

1 个赞

以下是说明:

3 个赞

功能已在控制台中启用,但我如何删除已删除的帖子?所有帖子都显示在已删除帖子中。

1 个赞

我确实不是这方面的专家,但这个主题中似乎有足够的信息片段来构建您所需的代码。

我在开头链接的主题中包含了创作者关于这是未知领域的警告,您需自行承担风险。但他们也提供了看似有用的 ‘destroy_all’ 部分,并建议先以批量方式开始操作。

该主题还包含几个示例,展示了如何针对帖子或主题(结合 @RGJ 提供的如何针对特定帖子的示例),应该能让您非常接近目标。

不过,我对此没有经验,因此很抱歉,由于我从未做过,无法给予肯定答复。:man_shrugging:

2 个赞

为了删除我们论坛上的旧帖子,我使用了以下方法。这是结合了 The proper way to completely delete hundred of topics via rails?@RGJ 的建议后得出的结果。

我最终选择这样做,是因为我非常希望从数据库中彻底删除数据,以保护用户隐私。将文本重写为“此帖子已被删除”仍然会保留编辑历史,且相对容易访问,因此不够彻底。

由于我们有 20,000 个主题需要删除,所以花费了一些时间!

Topic.with_deleted.where("deleted_at < '2021-08-28'").limit(1000).destroy_all

由于这留下了大量孤立帖子,我随后必须执行以下操作:

Post.where('topic_id not in (select id from topics)').limit(1000).destroy_all
4 个赞

我猜想您之后运行的 ./launcher cleanup 也释放了一些空间 :slight_smile:

1 个赞

不幸的是,尽管按预期运行,posts 表中仍然充满孤立帖子。topics 表已顺利清空。当我尝试通过 /t/topic_id 访问这些帖子时无法找到它们,但这可能是因为没有有效的 Topic ID。不过,我不太明白为什么它们仍然存在于表中。

有人能建议一种更好的方法来清理 posts 表吗?

1 个赞