Rake посты: rebake_incremental (запрос функции)

Уважаемые разработчики Discourse,

РЕ: rake posts:rebake (будущая функция)

rake posts:rebake                                                      # Обновить каждый пост последней разметкой Markdown
rake posts:rebake_match[pattern,type,delay]                            # Переработать все посты, соответствующие строке/регулярному выражению, и при желании задержать цикл

A. Было бы отлично иметь функцию переработки, позволяющую пользователю выполнять переработку только если идентификатор темы (или идентификатор поста) больше некоторого целого числа.

rake posts:rebake_incremental['topic_id', 34567]      # Переработать, если topic_id >= 34567
rake posts:rebake_incremental['post_id', 364123]      # Переработать, если post_id >= 364123

Причины:

(1) При переработке, особенно при выполнении задач миграции, разработчики могли уже мигрировать темы/посты; однако позже, когда они обновляют миграцию новыми постами (например, в активном форуме, когда миграция обновляется), нет способа (насколько мне известно) указать точку начала обработки. Сопоставление по шаблону для этого не предназначено (если только я не ошибаюсь).

(2) При тонкой настройке текста из старых форумов в Discourse в рамках задач миграции, например, при адаптации специальных символов из старого форума для работы с Markdown в форуме программирования или при настройке рекурсивных BB-кодов в устаревших форумах, полезно перерабатывать, например, последние 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

Вы можете выполнить все запрошенные действия и даже больше, запустив следующую команду в консоли Rails перед выполнением указанной выше задачи rake.

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

Просто измените условие под ваш конкретный случай. На мой взгляд, это гораздо более гибкий подход, чем использование задачи rake.

13 лайков

Идеально!!!

Спасибо, @gerhard!!

Полностью согласен на 1000%

Обожаю эту задачу rake и метод. Это просто замечательно!

Еще раз спасибо!!


Примечание: Одно из преимуществ этого метода, предложенного @gerhard, заключается в том, что мы можем «запечь» (сгенерировать) последние 1000 постов (например), и если нас устроят полученные результаты, то можно будет «запечь» остальные 999 000 постов. Это поистине драгоценная функция.

Еще раз спасибо


5 лайков