抱歉,如果这是个愚蠢的问题……为什么在 Discourse 中无法轻松从数据库中删除消息?
Discourse 使用一种称为“软删除”的机制,使得纠正错误变得容易。它还允许区分“对其他用户删除”和“对管理员删除”。
此外,它还能维护数据库的完整性。如果一个帖子在被删除之前被引用了怎么办?那么引用该帖子的帖子就会指向一个不再存在的帖子。这可能导致各种错误。
谢谢,现在我明白了……唯一的问题是如果有很多已删除的消息。
此前已多次讨论并提出过此请求,例如:
虽然我理解软删除可能有用,但在一段时间后(例如 1 周或 1 个月),最好能真正删除已删除的内容,以节省空间并确保符合法律要求,例如因为发布了非法内容,或需要移除个人信息以符合 GDPR 规定。
必须登录并运行 rake 任务将消息替换为“此内容已被删除”,这种做法略显简陋。
哎呀……抱歉,我从 phpBB 过来,以为可以这样操作。
现已实现
此致,
但我们该如何做到这一点???
我今天早上一直在尝试这个,但还没弄明白。
有什么建议吗?
好的,该设置需要在“管理 > 设置 > 安全”中配置(目前因某种原因被隐藏),然后需要像授予版主权限一样为每位管理员单独授予该权限。
一旦授予,它将会出现在帖子管理菜单中。
啊,那可能是我的障碍。我一直在管理设置中寻找 can_permanently_delete,但没看到它。
由于我们不鼓励使用此功能,因此该站点设置已隐藏。该功能最初是为处理敏感信息被发布的情况而设计的,以便从数据库中彻底清除这些信息。此外,该操作本身并非批量操作。
由于这是一个隐藏的站点设置,启用它的唯一方法是通过控制台。
这几乎完全符合我的需求!谢谢。
我该如何编写语法,使其仅涵盖 xxxx 日期之前删除的所有帖子?
那将是 Post.with_deleted.where("deleted_at < 'YYYY-mm-dd'").update_all(...)
您能告诉我们如何从控制台启用它吗?
以下是说明:
功能已在控制台中启用,但我如何删除已删除的帖子?所有帖子都显示在已删除帖子中。
我确实不是这方面的专家,但这个主题中似乎有足够的信息片段来构建您所需的代码。
我在开头链接的主题中包含了创作者关于这是未知领域的警告,您需自行承担风险。但他们也提供了看似有用的 ‘destroy_all’ 部分,并建议先以批量方式开始操作。
该主题还包含几个示例,展示了如何针对帖子或主题(结合 @RGJ 提供的如何针对特定帖子的示例),应该能让您非常接近目标。
不过,我对此没有经验,因此很抱歉,由于我从未做过,无法给予肯定答复。![]()
为了删除我们论坛上的旧帖子,我使用了以下方法。这是结合了 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
我猜想您之后运行的 ./launcher cleanup 也释放了一些空间 ![]()
不幸的是,尽管按预期运行,posts 表中仍然充满孤立帖子。topics 表已顺利清空。当我尝试通过 /t/topic_id 访问这些帖子时无法找到它们,但这可能是因为没有有效的 Topic ID。不过,我不太明白为什么它们仍然存在于表中。
有人能建议一种更好的方法来清理 posts 表吗?