管理工具/扳手在小型操作帖子中

我记起了之前的一篇帖子。以防将来其他人也能从中受益,这是我最终解决此问题的方案!


删除不需要的“小动作”帖子

需要下面的 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_id}"
      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 "在主题 #{topic_id} 中未找到带有 'delete' 的小动作帖子"
      return
    end

    puts "在主题 ##{topic_id} 中找到 #{to_delete.size} 个匹配的帖子"

    to_delete.each do |post|
      if dry_run
        puts "将永久删除帖子 ##{post.id} (创建于 #{post.created_at},作者 #{post.user.username})"
      else
        post.destroy()
        puts "🗑️ 永久删除了帖子 ##{post.id}"
      end
    end

    puts dry_run ? "试运行完成——未删除任何帖子。" : "完成主题 #{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 个赞