小規模アクション投稿での管理者ツール/レンチ

少し前の投稿を思い出しました。もし将来誰かの役に立つかもしれないので、これが最終的に私がこの問題に対して見つけた解決策です!


不要な小さなアクション投稿を削除する

これを実行するには、以下の Rails スクリプトが必要です。私はこれを smalldelete.rb と名付け、コンテナ内で /var/www/discourse/script に配置しました。

また、削除したいすべての小さなアクション投稿の本文に、保持したいものと区別するために単語 delete が入っていることを確認する必要があります。自動更新 (Auto Bump) 投稿の例を以下に示します。

必要に応じて、p.raw.strip.downcase == "delete" の行を別のキーワードに変更することで、そのキーワードを変更できます。

smalldelete.rb 用スクリプト


class TopicCleaner
  def self.delete_small_actions(topic_id, dry_run: false)
    topic = Topic.find_by(id: topic_id)
    unless topic
      puts "Topic #{topic_id} not found"
      return
    end

    posts = topic.posts.where(post_type: Post.types[:small_action])
    to_delete = posts.select { |p| p.raw.strip.downcase == "delete" }

    if to_delete.empty?
      puts "No small action posts with 'delete' found in topic #{topic_id}"
      return
    end

    puts "Found #{to_delete.size} matching posts in topic ##{topic_id}"

    to_delete.each do |post|
      if dry_run
        puts "Would PERMANENTLY delete post ##{post.id} (created #{post.created_at}, by #{post.user.username})"
      else
        post.destroy()
        puts "🗑️ Permanently deleted post ##{post.id}"
      end
    end

    puts dry_run ? "Dry run complete — no posts deleted." : "Finished permanent cleanup of topic #{topic_id}"
  end
end

このスクリプトは、ID でトピックを見つけ、そのトピック内のすべての投稿をチェックして、定義されたキーワードのみが含まれているかどうかを確認します。これが真であれば、その特定の投稿を削除対象としてマークします。


スクリプトを設定した後、Rails コンソールに入り、次のようにロードできます。

load Rails.root.join("script/smalldelete.rb")

そして、最後に次のように実行できます。

TopicCleaner.delete_small_actions(topic_id, dry_run: false)

dry_run フラグも含まれており、必要に応じて恒久的に削除されるものを正確にリストアップできます。


もちろん、これらの変更は完全に見た目に関するものであり、コンテンツに関しては何の違いもありません。ソフト削除された投稿はスタッフ以外のメンバーには表示されないためです。

しかし、私はすべてをきれいに整頓することに特にこだわりがあるので、フォーラムの所有者がこれを利用したいと考えるケースは間違いなくあるでしょう!

「いいね!」 1