Rake 帖子:rebake_incremental(功能请求)

亲爱的 Discourse 开发者们:

主题:rake posts:rebake(未来功能)

rake posts:rebake                                                      # 使用最新 Markdown 更新每篇帖子
rake posts:rebake_match[pattern,type,delay]                            # 重新渲染匹配字符串/正则表达式的所有帖子,并可选择延迟循环

A. 希望能提供一个重新渲染功能,允许用户仅在话题 ID(或帖子 ID)大于某个整数时进行重新渲染。

rake posts:rebake_incremental['topic_id', 34567]      # 若 topic_id >= 34567 则重新渲染
rake posts:rebake_incremental['post_id', 364123]      # 若 post_id >= 364123 则重新渲染

理由:

(1) 在进行重新渲染时,尤其是在处理迁移任务时,开发者可能已经迁移了某些话题或帖子;但随后当他们更新迁移以包含新帖子时(例如在活跃论坛中更新迁移),目前似乎没有方法(至少我目前所知)指定渲染的起始点。模式匹配并非为此设计(除非我理解有误)。

(2) 在处理将旧论坛文本精细调整以适配 Discourse 的迁移任务时,例如调整旧论坛中的特殊字符以在编程论坛中与 Markdown 兼容,或调整旧论坛中的递归 BBCode,重新渲染最后 1000 篇帖子(而非整个数据库)是非常有用的。

B. 比 A 更灵活(指定比较运算符)

rake posts:rebake_incremental['topic_id', '>=', 34567]      # 若 topic_id >= 34567 则重新渲染
rake posts:rebake_incremental['post_id', '<', 364123]      # 若 post_id < 364123 则重新渲染

通用格式:

rake posts:rebake_incremental[target, operator, id]

其中:

  • target 为 topic_id 或 post_id
  • operator 为算术比较运算符
  • id 为整数,可以是 topic_id 或 post_id

注意:迁移任务通常需要多次迭代才能完成,尤其是原始论坛中帖子的文本和编码转换到 Discourse 时。许多在非 Markdown 论坛中可用的字符,在迁移到基于 Markdown 处理的论坛时会导致问题。如上文所示,对重新渲染过程拥有更多控制权将大有裨益。

3 个赞

还有一个用于重新烘焙的 rake 任务:

rake posts:rebake_uncooked_posts

您可以在执行上述 rake 任务之前,在 Rails 控制台中运行以下命令,完成您要求的所有操作,甚至更多。

DB.exec(<<~SQL)
  UPDATE posts
  SET baked_version = NULL
  WHERE topic_id >= 34567
SQL

只需根据您的具体用例调整条件即可。在我看来,这比 rake 任务灵活得多。

13 个赞

完美!!!

感谢 @gerhard!!

完全同意,1000% 支持!

太喜欢这个 rake 任务和这个方法了。简直太棒了!

再次感谢!!


注意:@gerhard 提出的这个方法的一个优点在于,我们可以先预渲染(bake)最近的 1000 篇帖子(例如),如果对结果满意,再继续预渲染剩下的 999,000 篇帖子。这真是一个极具价值的功能亮点。

再次感谢


5 个赞