数千の個人メッセージを削除する方法?

私たちのコミュニティでは、ユーザー間で数千件のプライベートメッセージがやり取りされています。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

問題が発生しなかった場合は、最後の 2 手順を省略できます。問題が発生した場合は、discourse restore コマンドで出力された最新のバックアップをコピーして貼り付け、バックアップを復元してください。

すべてのメッセージを一度に削除できます。

rake destroy:private_messages

参照:

よくやりましたね、@IAmGav!そこを探したのに、見落としてしまいました。

ありがとう、ジェイ。
データベース上で直接バッチ削除クエリを実行するのは怖いですね :sweat_smile:

この関数の仕組みを簡単に確認しました。実行すると、すべてのプライベートメッセージが削除されることがわかりました。

  def destroy_private_messages
    Topic.where(archetype: "private_message").find_each do |pm|
      @io.puts "Destroying #{pm.slug} pm"
      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.wherewhere("posts_count > 100") で拡張する必要があります)