重新生成匹配特定模式的所有帖子

:bookmark: 本指南介绍如何使用 Rails 控制台的高级选项,重新烘焙(rebake)所有匹配特定字符串或正则表达式的 Discourse 帖子。

:person_raising_hand: 所需用户级别:管理员

:warning: 需要控制台访问权限

想要重新烘焙所有匹配特定字符串或正则表达式的帖子吗?让我们开始吧!

访问您的站点

首先,通过 SSH 连接到您的 Discourse Droplet,并进入 Discourse 实例的 Docker 容器:

cd /var/discourse
./launcher enter app

重新烘焙包含特定字符串的所有帖子

使用以下命令,将 pattern 替换为您要匹配的字符串。此搜索不区分大小写。

rake posts:rebake_match["pattern"]

例如,要重新烘焙原始内容中包含 :slight_smile: 的所有帖子:

rake posts:rebake_match[":slight_smile:"]

重新烘焙匹配正则表达式的所有帖子

:information_source: PostgreSQL 使用 POSIX 正则表达式 执行正则匹配。匹配过程不区分大小写。系统会自动应用换行敏感标志 ((?n)),这意味着 . 不会匹配换行符,而 ^/$ 将在行边界处匹配。

对于正则表达式,请使用以下命令:

rake posts:rebake_match["pattern",regex]

示例:

  • 重新烘焙包含 :slight_smile:Discourse 的帖子:

    rake posts:rebake_match[":slight_smile:|Discourse",regex]
    
  • 重新烘焙以 Today 开头的帖子:

    rake posts:rebake_match["^Today",regex]
    
  • 重新烘焙以 TodayYesterday 开头的帖子:

    rake posts:rebake_match["^(Today|Yesterday)",regex]
    

重新烘焙之间的可选延迟

若要在每次重新烘焙执行之间添加 5 秒延迟,请修改命令如下。将 5 调整为您需要的任意秒数:

rake posts:rebake_match["pattern",string,5]

高级:使用 Rails 控制台

对于 rake 任务无法满足的任务,请使用 Rails 控制台。

访问 Rails 控制台

在 Docker 容器内启动 Rails 控制台:

rails c

使用 rebake uncooked rake 任务

将目标帖子设置为“未烘焙”状态以进行重新烘焙。运行设置后退出 Rails 控制台,然后执行重新烘焙命令:

重新烘焙整个分类:

rails c
Post.joins(:topic).where('topics.category_id = 136').update_all('baked_version = NULL')
exit
rake posts:rebake_uncooked_posts

在 Rails 控制台中执行循环

若要执行细粒度操作,请选择帖子数组并直接重新烘焙每个帖子。

特定用户的帖子

user = User.find_by_username('user123')
posts = Post.where(user_id: user.id)
posts.each do |p|
  p.rebake!
end

包含特定字符串的帖子

posts = Post.where("cooked like '%OldCDN%'")
posts.each do |p|
  p.rebake!
end
40 个赞

有没有一种简单的方法可以取消指定日期之前创建的所有帖子/线程?