私たちのコミュニティでは、ユーザー間で数千件のプライベートメッセージがやり取りされています。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!そこを探したのに、見落としてしまいました。
ありがとう、ジェイ。
データベース上で直接バッチ削除クエリを実行するのは怖いですね ![]()
この関数の仕組みを簡単に確認しました。実行すると、すべてのプライベートメッセージが削除されることがわかりました。
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.where を where("posts_count > 100") で拡張する必要があります)