카테고리가 없는 주제를 삭제할 수 없습니다

데이터베이스에 category_id가 있는 주제가 하나 있습니다. 해당 카테고리는 누군가가 삭제한 상태입니다. 이 주제는 ID를 통해 직접 열 수 있습니다:
url: …/t/3

topics 테이블에서 id = 3인 행의 category 값은 4입니다. 하지만 이 카테고리는 삭제되어 categories 테이블에 존재하지 않습니다. 이러한 상태의 유실된 주제 중 많은 것은 삭제할 수 있었습니다. 하지만 이 주제는 closed와 archived 속성이 true로 설정되어 있어 삭제되지 않습니다.

팝업 메뉴에서 "영구 삭제"를 선택하여 이 주제를 삭제하려고 하면 다음 오류 메시지가 표시됩니다:
“오류가 발생했습니다: 이 주제에는 삭제되지 않은 게시물이 있습니다. 주제를 영구 삭제하기 전에 먼저 게시물을 영구 삭제하십시오.”

data베이스에 id가 4인 더미 카테고리를 삽입하거나 이 유실된 주제를 삭제하는 방법에 대한 아이디어가 있으신가요?

이것은 General 카테고리의 소개(About) 주제인 것 같습니다. 일반적으로 소개 주제는 UI에서 삭제할 수 없게 설정되어 있습니다.

이 주제를 완전히 삭제하려는 특별한 이유가 있으신가요?

해당 카테고리가 더 이상 사용 가능하지 않기 때문인지, 아니면 더 중요한 문제가 있는 건지: 사이드바에 있는 모든 카테고리에 대한 링크가 더 이상 작동하지 않습니다.
…/categories 를 열려고 하면 "Error Something went wrong."라는 오류 메시지가 표시되고, 브라우저 콘솔에는 다음과 같은 오류 메시지가 나타납니다:

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
Error while processing route: discovery.categories t.category_list.categories is undefined 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
... and much more

카테고리에 토픽이 있는 상태에서 삭제된 것처럼 보이네요? 이런 일은 일어나지 않아야 합니다. 다음과 같은 작업을 수행해야 할 것 같습니다.

rails c
c=Category.last; # 또는 카테고리를 가져오는 다른 방법)
Topic.where(category_id: 4).update_all(category_id: c.id)

UI를 통해 General 카테고리가 안전하게 삭제되었다면, 현재 보고 계신 것처럼 About 토픽이 소프트 삭제된 것은 예상되는 동작입니다. 이로 인해 문제가 발생하지는 않아야 합니다. :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'

result:
id 	closed 	archived 	title 	category
3 	true 	true 	Über die Kategorie Team 	4

흠. 내 생각엔 당신의 고장 난 토픽의 category_id가 4였을 것 같은데요.

제 추측으로는 그게 최선이었어요. 예산이 있다면 Marketplace 채널에서 도움을 요청해 보시는 게 좋겠습니다. Rails 코드를 들여다보고 원인을 파악해 줄 누군가가 필요할 것 같아요.

#marketplace를 사용하는 것도 항상 좋은 방법입니다, 특히 긴급한 경우라면 더더욱 그렇습니다. :heart:

다만, 여기에서 조금 더 자세한 정보를 제공하면 jimmy가 커뮤니티의 답변을 유도하는 데 도움이 될 수 있습니다. :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: 한쪽에서는 찾을 수 있고 다른 쪽에서는 찾을 수 없는 경우는 좀 unusual합니다.

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:

안타깝게도 이는 카테고리 링크 오류를 수정하지 못합니다. 하지만 삭제할 수 없는 게시글 문제는 당분간 해결되었습니다. 카테고리 문제도 로그에 기록되지 않습니다. 앞으로 며칠 안에 이 문제를 해결하겠습니다.