削除済み投稿を一括で完全に削除する?

愚かな質問でしたら申し訳ありません。
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