Исправить постоянные ссылки, чтобы они указывали на URL темы, а не на первое сообщение темы

После кастомизированной миграции многие пермалинки указывали на первый пост в теме, а не на саму тему.

Например, пермалинки указывали на
https://forum.example.com/t/example-topic/123/1

вместо
https://forum.example.com/t/example-topic/123


Проверка

Форум Discourse затронут, если для этого SQL-запроса есть записи:

SELECT permalinks.*,
       posts.id,
       posts.topic_id,
       posts.post_number
FROM permalinks
         LEFT JOIN posts
                   ON posts.id = permalinks.post_id
WHERE permalinks.post_id IS NOT NULL
  AND posts.post_number = 1
LIMIT 20;

Быстрое исправление

Это изменение направляет пермалинки непосредственно на тему, если изначально они указывали на первый пост в теме.

UPDATE permalinks
SET topic_id = posts.topic_id,
    post_id  = NULL
FROM posts
WHERE permalinks.post_id = posts.id
  AND permalinks.post_id IS NOT NULL
  AND posts.post_number = 1;

Это может быть хорошим例行ным скриптом очистки, который стоит запускать в конце скриптов миграции.

Как вы создавали постоянные ссылки?

Например, здесь discourse/script/import_scripts/vanilla_mysql.rb at main · discourse/discourse · GitHub они специально проверяют номер поста. Если он равен 1, то post_is не передаётся (оставляется NULL), и поэтому постоянная ссылка не должна указывать на первый пост.

Я использовал подход на основе SQL для постоянных ссылок, основанный на коде, похожем на

… но без условия AND post_number <> 1 — именно это и было причиной проблемы.