我记起了之前的一篇帖子。以防将来其他人也能从中受益,这是我最终解决此问题的方案!
删除不需要的“小动作”帖子
需要下面的 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 标志,如果需要,可以列出确切将要被永久删除的内容。
当然,这些更改完全是美学上的,对内容没有任何影响,因为未被软删除的帖子非工作人员是看不到的。
不过,我特别喜欢让一切看起来整洁漂亮,所以我完全可以想象某些论坛所有者可能希望利用这一点!
