如何删除数千条个人消息?

我们的社区有数千条用户之间发送的私人消息。有没有办法从数据库中完全删除回复超过100条的私人消息(无法恢复)?

嗯,我认为这应该能满足你的需求。它将删除所有非系统用户或 discobot 创建的私信。不过,它仍然会删除其他任何私信,包括来自管理员的私信。

这段代码尚未经过测试。我并没有说这是个好主意,也不能保证它不会造成不良影响。

cd /var/discourse
discourse backup
./launcher enter app
rails s
Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all
exit
discourse enable_restore
discourse restore

如果一切正常,你可以省略最后两步。如果出现问题,你需要复制粘贴 discourse restore 命令输出的最新备份信息,以恢复备份。

您可以一次性删除所有消息。

rake destroy:private_messages

参考:

干得漂亮,@IAmGav!我发誓我看过那里,但没看到。

谢谢 Jay,
直接在数据库上运行批量删除查询实在太让人害怕了 :sweat_smile:

我简单看了一下这个函数的工作原理。结果发现,运行后所有私信都会被删除。

  def destroy_private_messages
    Topic.where(archetype: "private_message").find_each do |pm|
      @io.puts "正在销毁 #{pm.slug} 私信"
      first_post = pm.ordered_posts.first
      @io.puts PostDestroyer.new(Discourse.system_user, first_post).destroy
    end
  end

我想我得选择@pfaffman 指出的那个比较“吓人”的方式来过滤消息,或者尝试定义一个自定义的 Rake 任务,并使用 PostDestroyer.new(Discourse.system_user, first_post).destroy

重新讨论这个旧话题,因为没有一个答案是100%正确的。

rake 任务 rake destroy:private_messages 不会硬删除所有私人消息,它只会软删除它们。管理员仍然可以看到它们,并且可以恢复它们。

Rails 代码 Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all 会删除主题,但不会删除实际的消息。它们仍然在数据库中,可以使用例如数据浏览器插件来查看。

这段代码永久删除所有私人消息帖子和主题:
警告:这里有锋利的刀!

Post.where(topic_id: Topic.where(archetype: 'private_message').where("user_id > 0")).destroy_all
Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all

(要将此过滤到回复超过100条的主题,您需要在两行中将 Topic.where 扩展为 where("posts_count > 100")