NoMethodError при перестроении действий пользователя

Всем привет! Изначально я отправил это сообщение в раздел Support, но теперь я почти уверен, что это ошибка, так как мне удалось воспроизвести её несколько раз на чистых установках. Проблема появилась после последнего релиза Discourse. Вот шаги для воспроизведения:

  1. Выполните обычную установку и настройку Discourse (я получил ту же ошибку при установке на Ubuntu Server 18.04 LTS, а также на Ubuntu Server 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 в виде целых чисел, или есть ещё какие-то места, куда часть этих данных записывается?

Спасибо!

Наши импортеры в целом предлагают фреймворк для выполнения этой задачи во время миграций. Я бы изучил исходный код на их стороне.

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

4 лайка

Эта тема была автоматически закрыта через 4 дня. Новые ответы больше не принимаются.