Невозможно удалить тему без категории

У меня в базе данных есть тема с category_id, соответствующим удалённой категории. Я могу открыть эту тему напрямую по её ID:
URL: …/t/3

В таблице topics у записи с id = 3 значение category = 4. Однако эта категория удалена и отсутствует в таблице categories. Многие из таких «потерянных» тем я мог бы удалить, но эта не удаляется, так как атрибуты closed и archived установлены в true.

Если в всплывающем меню выбрать «Перманентно удалить» эту тему, появляется сообщение об ошибке:
«Произошла ошибка: у этой темы есть не удалённые посты. Пожалуйста, перманентно удалите их перед удалением темы».

Есть ли идеи, как вставить в базу данных фиктивную категорию с id = 4 или как удалить эту «потерянную» тему?

Кажется, это тема «О проекте» для категории General? Обычно темы «О проекте» нельзя удалить через интерфейс.

Есть ли причина, по которой вы хотите полностью удалить эту тему?

Поскольку эта категория больше недоступна, но что важнее: ссылка на все категории в боковой панели больше не работает.
При попытке открыть …/categories появляется сообщение об ошибке: «Ошибка. Что-то пошло не так», а в консоли браузера отображается следующее сообщение об ошибке:

Uncaught TypeError: i is null
    reason binary.js:7
    l item.js:166
    get topic.js:1017
    ee upload.js:65
    get topic.js:1017
    get topic.js:1017
    eM topic.js:1017
    s backup-codes.js:33
    n backup-codes.js:33
    Z upload.js:65
    T backup-codes.js:33
    evaluate backup-codes.js:33
    _execute backup-codes.js:33
    execute backup-codes.js:33
    rerender backup-codes.js:33
    render theme-setting.js:6
    _renderRoots theme-setting.js:6
    tA backup-codes.js:33
    _renderRoots theme-setting.js:6
    _renderRootsTransaction theme-setting.js:6
    _revalidate theme-setting.js:6
    invoke client-error-handler.js:88
    flush client-error-handler.js:88
    flush client-error-handler.js:88
    _end client-error-handler.js:88
    end client-error-handler.js:88
    _run client-error-handler.js:88
    run client-error-handler.js:88
    d bookmark.js:114
    Ember 2
    _join client-error-handler.js:88
    join client-error-handler.js:88
    p bookmark.js:114
    h bookmark.js:114
    $ topic.js:1017
    trigger composer-action-title.js:62
    transitionStarted add-translation.js:27
    loading ace-editor.js:176
    D upload.js:65
    triggerEvent upload.js:65
    trigger form-template-validation.js:54
    _handleSlowTransition upload.js:65
    invoke client-error-handler.js:88
    flush client-error-handler.js:88
    flush client-error-handler.js:88
    _end client-error-handler.js:88
    end client-error-handler.js:88
    _runExpiredTimers client-error-handler.js:88
    setTimeout handler*setTimeout client-error-handler.js:88
    _installTimerTimeout client-error-handler.js:88
    _later client-error-handler.js:88
    later client-error-handler.js:88
    T bookmark.js:114
    _triggerAction form-template-validation.js:54
    click form-template-validation.js:54
binary.js:7
Uncaught TypeError: i is null
    reason binary.js:7
    l item.js:166
    get topic.js:1017
    ee upload.js:65
    get topic.js:1017
    get topic.js:1017
    eM topic.js:1017
    s backup-codes.js:33
    n backup-codes.js:33
    Z upload.js:65
    T backup-codes.js:33
    evaluate backup-codes.js:33
    _execute backup-codes.js:33
    execute backup-codes.js:33
    rerender backup-codes.js:33
    render theme-setting.js:6
    _renderRoots theme-setting.js:6
    tA backup-codes.js:33
    _renderRoots theme-setting.js:6
    _renderRootsTransaction theme-setting.js:6
    _revalidate theme-setting.js:6
    invoke client-error-handler.js:88
    flush client-error-handler.js:88
    flush client-error-handler.js:88
    _end client-error-handler.js:88
    end client-error-handler.js:88
    _run client-error-handler.js:88
    run client-error-handler.js:88
    d bookmark.js:114
    success base.js:71
    l loader.js:1286
    fireWith loader.js:1286
    jQuery 4
    a base.js:71
    e named-references.js:49
    e named-references.js:49
    A base.js:71
    _findCategoriesAndTopics item.js:166
    k named-references.js:49
    w named-references.js:49
    invoke client-error-handler.js:88
    flush client-error-handler.js:88
    flush client-error-handler.js:88
    _end client-error-handler.js:88
    end client-error-handler.js:88
    _runExpiredTimers client-error-handler.js:88
    setTimeout handler*setTimeout client-error-handler.js:88
    _installTimerTimeout client-error-handler.js:88
    _later client-error-handler.js:88
    later client-error-handler.js:88
    T bookmark.js:114
    _triggerAction form-template-validation.js:54
    click form-template-validation.js:54
TypeError: t.category_list.categories is undefined
    s form-template-validation.js:54
    categoriesFrom form-template-validation.js:54
    _findCategoriesAndTopics item.js:166
    k named-references.js:49
    w named-references.js:49
    invoke client-error-handler.js:88
    flush client-error-handler.js:88
    flush client-error-handler.js:88
    _end client-error-handler.js:88
    end client-error-handler.js:88
    _run client-error-handler.js:88
    run client-error-handler.js:88
    d bookmark.js:114
    success base.js:71
    l loader.js:1286
    fireWith loader.js:1286
    jQuery 4
    a base.js:71
    e named-references.js:49
    e named-references.js:49
    A base.js:71
    _findCategoriesAndTopics item.js:166
    k named-references.js:49
    w named-references.js:49
    invoke client-error-handler.js:88
    flush client-error-handler.js:88
    flush client-error-handler.js:88
    _end client-error-handler.js:88
    end client-error-handler.js:88
    _runExpiredTimers client-error-handler.js:88
    setTimeout handler*setTimeout client-error-handler.js:88
    _installTimerTimeout client-error-handler.js:88
    _later client-error-handler.js:88
    later client-error-handler.js:88
    T bookmark.js:114
    _triggerAction form-template-validation.js:54
    click form-template-validation.js:54
Ошибка при обработке маршрута: discovery.categories свойство t.category_list.categories не определено 3069/categoriesFrom/s<@https://forum.mydiscourse.de/assets/chunk.0144d0b7f03b4dd2b0a0.d41d8cd9.js:9:2817
categoriesFrom@https://forum.mydiscourse.de/assets/chunk.0144d0b7f03b4dd2b0a0.d41d8cd9.js:9:2809
11341/_findCategoriesAndTopics/<@https://forum.mydiscourse.de/assets/chunk.0144d0b7f03b4dd2b0a0.d41d8cd9.js:27:122623
k@https://forum.mydiscourse.de/assets/chunk.0144d0b7f03b4dd2b0a0.d41d8cd9.js:441:164470
w@https://forum.mydiscourse.de/assets/chunk.0144d0b7f03b4dd2b0a0.d41d8cd9.js:441:164363
invoke@https://forum.mydiscourse.de/assets/chunk.0144d0b7f03b4dd2b0a0.d41d8cd9.js:202:7701
flush@https://forum.mydiscourse.de/assets/chunk.0144d0b7f03b4dd2b0a0.d41d8cd9.js:202:6778
flush@https://forum.mydiscourse.de/assets/chunk.0144d0b7f03b4dd2b0a0.d41d8cd9.js:202:8650
... и многое другое

Похоже, кто-то удалил категорию, в которой есть темы? Так быть не должно. Думаю, вам нужно сделать что-то вроде:

rails c
c=Category.last; # или какой-то другой способ получить категорию
Topic.where(category_id: 4).update_all(category_id: c.id)

Если категория General была удалена корректно через интерфейс, то ожидаемо, что тема «О проекте» будет мягко удалена, как вы наблюдаете. Это не должно вызвать никаких проблем. :thinking:

Похоже, здесь задействован ещё какой-то фактор. Есть ли на странице /logs дополнительная информация об этой ошибке?

Это, похоже, не работает:

discourse(prod)> Topic.where(category_id: 4).update_all(category_id: 20)
=> 0
discourse(prod)> Topic.where(id: 3).update_all(category_id: 20)
=> 0

А в Data Explorer я получаю:

Select id, closed, archived, title, category_id
from topics 
where id = '3'

результат:
id 	closed 	archived 	title 	category
3 	true 	true 	Über die Kategorie Team 	4

Хм. Я думал, что у вашей сломанной темы category_id был равен 4.

Это было моё лучшее предположение. Если у вас есть бюджет, вы можете попросить о помощи в канале Marketplace. Думаю, вам понадобится кто-то, кто разбирается в Rails, чтобы понять, в чём проблема.

Marketplace всегда вариант, особенно если это срочно. :heart:

Хотя немного больше деталей здесь могло бы помочь поднять реакцию сообщества. :crossed_fingers:

Вы оба, похоже, уверены, что корневая причина в этой теме. Если Data Explorer может её найти, то вы должны суметь найти её и в консоли Rails. Если вы можете её найти, то должны суметь использовать post_destroyer для неё и удалить оттуда?

(Хотя я немного колеблюсь рекомендовать это, так как ещё не совсем связал все точки, чтобы понять, где именно проблема)

Да, в консоли Ruby я вижу эту тему:

result = ActiveRecord::Base.lease_connection.exec_query('SELECT id, category_id FROM topics WHERE id = 3')
result.rows
=> [[3, 4]]

но в Topic ничего нет:

Topic.where(id: 3)
=> []

Как вы видите, найти его возможно. Но я не знаю синтаксиса Ruby, чтобы удалить именно эту запись таблицы.

Хм. :thinking: Необычно, что это можно найти одним способом, но не другим.

Консоль Rails может быть довольно острым инструментом, поэтому лучше всего точно выяснить, что именно пошло не так, чтобы минимизировать любые аварии или побочные эффекты.

Как именно была удалена эта категория?

(На случай, если проблема вызвана не этим случайным топиком, я также добавлю основы проверки безопасного режима и посмотрю, есть ли дополнительная информация об ошибке на странице YourSite/logs)

Хотя я не знаю, находятся ли ваши данные в таком состоянии, когда универсальное решение для удаления категории могло бы помочь? Bulk delete all topics in a category

Хороший вопрос. Это было сделано несколько лет назад другим администратором.

Тем временем я удалил эту тему напрямую в консоли Rails с помощью:

result = ActiveRecord::Base.lease_connection.exec_delete('DELETE FROM topics WHERE id = 3')

После этого тема была удалена :grinning_face:

И это также решило вашу странную ссылку на категорию в боковой панели?

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

Если выясните, в чём связь, дайте знать. :slight_smile:

К сожалению, это не исправляет ошибку с ссылкой на категорию. Однако проблема с неудаляемым сообщением на данный момент решена. Проблема с категорией также не фиксируется в логах. Я займусь этим в ближайшие дни.