사용자 작업 재구성 시 NoMethodError 발생

여러분 안녕하세요. 처음에는 Support 채널에 이 문제를 게시했지만, 신규 설치 환경에서 여러 번 재현해 본 결과 이제 버그라고 확신합니다. 최신 Discourse 릴리스 이후부터 이 문제를 겪고 있습니다. 재현 단계를 아래에 공유합니다:

  1. 일반적인 Discourse 설치 및 설정을 진행합니다 (Ubuntu Server 18.04 LTS와 20.04 LTS 모두에서 동일한 오류가 발생했습니다)

  2. 설치가 완료된 후 컨테이너에 들어가서 rake user_actions:rebuild를 실행하면 다음과 같은 오류가 발생합니다:

    # rake user_actions:rebuild --trace
    ** Invoke user_actions:rebuild (first_time)
    ** Invoke environment (first_time)
    ** Execute environment
    ** Execute user_actions:rebuild
    rake aborted!
    NoMethodError: undefined method `log_topic' for UserActionManager:Class
    /var/www/discourse/lib/tasks/user_actions.rake:14:in `block (2 levels) in <top (required)>'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.2.2/lib/active_record/relation/delegation.rb:85:in `each'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.2.2/lib/active_record/relation/delegation.rb:85:in `each'
    /var/www/discourse/lib/tasks/user_actions.rake:14:in `block in <top (required)>'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:281:in `block in execute'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:281:in `each'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:281:in `execute'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
    /usr/local/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:188:in `invoke'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:160:in `invoke_task'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `block (2 levels) in top_level'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `each'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `block in top_level'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:125:in `run_with_threads'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:110:in `top_level'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:83:in `block in run'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:186:in `standard_exception_handling'
    /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:80:in `run'
    bin/rake:13:in `<top (required)>'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `load'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `kernel_load'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:28:in `run'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:476:in `exec'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor.rb:399:in `dispatch'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:30:in `dispatch'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/base.rb:476:in `start'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:24:in `start'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:46:in `block in <top (required)>'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/friendly_errors.rb:123:in `with_friendly_errors'
    /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:34:in `<top (required)>'
    /usr/local/bin/bundle:23:in `load'
    /usr/local/bin/bundle:23:in `<main>'
    Tasks: TOP => user_actions:rebuild

다른 게시물들에서 비슷한 오류가 발생하면 ./launcher rebuild app을 실행하라는 조언을 봤지만, 그렇게 해본 후에도 여전히 NoMethodError가 발생했습니다.

아무런 조언도 감사하겠습니다. 미리 감사합니다!

1개의 좋아요

저도 이 오류를 확인하고 있습니다. Ubuntu 19.10을 사용 중입니다.

죄송합니다. 이 작업은 더 이상 존재하지 않아야 합니다. 이미 여러 해 동안 깨진 상태였습니다.

제거했습니다.

사용자 작업을 다시 구축하는 것은 가능할 수 있지만, assign과 solved와 같은 플러그인을 고려해야 하므로 매우 복잡합니다.

4개의 좋아요

@sam, 정보를 알려주셔서 감사합니다. 그 사실을 몰랐습니다. 참고로 며칠 전에는(적어도 제 환경에서는) 문제 없이 해당 작업이 정상적으로 실행되었습니다. 임포트 이후에도 성공적으로 실행되었고, 예상대로 사용자 활동이 재구축되었습니다.

그럼 이 작업을 실행하는 대신, Discourse에서 데이터를 올바르게 사용할 수 있도록 이 데이터를 재구축하는(또는 임포트 초기에 저장하는) 권장 방법이 있을까요?

예를 들어, 저는 Discourse 이전의 좋아요 기록을 모두 가져와 user_action 테이블의 모든 필드에 맞게 매핑하는 데 성공했습니다. 이 작업을 성사시키는 데 중요한 부분은 위에서 언급한 rake 명령어를 실행하는 것이었는데, 이렇게 해야 각 사용자의 정확한 좋아요 기록(가장 많이 받은 좋아요, 준 좋아요, 받은 좋아요 등)이 표시되었습니다. 만약 위의 rake 명령어가 제거된다면, 프로필과 사용자 통계에 올바르게 표시되도록 사용자 활동이 데이터베이스의 다른 어디에 저장되어야 하는지 방향을 알려주시겠어요? 이 데이터가 단순히 user_stats 테이블에 정수 형태로 집계되어 저장되는 건가요, 아니면 일부가 다른 곳에 저장되나요?

감사합니다!

일반적으로 우리의 가져오기(importer)들은 마이그레이션 중에 이 작업을 수행하기 위한 프레임워크를 제공합니다. 관련 소스 코드를 검토해 보시는 것을 권해 드립니다.

discourse/script/import_scripts at main · discourse/discourse · GitHub

4개의 좋아요

이 주제는 4일 후 자동으로 닫혔습니다. 더 이상 새 답변을 작성할 수 없습니다.