Это устранило ошибку. Я предполагаю, что из-за того, что класс не был найден ранее, он воспринимался как константа? В любом случае, проблема решена, отлично, большое спасибо! Я больше не застрял!
Причина, по которой у меня было это:
user.approved = true
user.approved_by_id = Discourse.system_user.id
до:
reviewable.perform(:approve, Discourse.system_user)
заключается в том, что добавление в очередь ревью выполняется асинхронно. В задаче ревью создается только если approve равно false (discourse/app/jobs/regular/create_user_reviewable.rb at 888e68a1637ca784a7bf51a6bbb524dcf7413b13 · discourse/discourse · GitHub):
if user = User.find_by(id: args[:user_id])
return if user.approved?
@reviewable = ReviewableUser.needs_review!(
target: user,
created_by: Discourse.system_user,
reviewable_by_moderator: true,
payload: {
username: user.username,
name: user.name,
email: user.email
}
)
Существует риск, что задача может выполниться после того, как вы проверили наличие записи ревью?
В результате запись ревью может казаться несуществующей, хотя задача просто ждет запуска. Затем задача выполняется и создает запись ревью, но вы упустили возможность её устранить, так как ваш код проверки уже выполнился.
Это потенциальное состояние гонки?
Установите approved в true перед проверкой наличия записи ревью, и вы решите проблему (поскольку ревью никогда не будет создано после этого, так как это зависит от этого условия).
Я столкнулся с этой проблемой при тестировании своего кода — на dev-окружении всё работало, а на production упало, так как процессы выполнялись в другом порядке.
NB: Я понимаю, что вы не писали это для поддержки такого сценария использования, но считаю важным предоставить возможность плагинам автоматически одобрять новых пользователей в особых случаях (например, как это делает плагин Discord, если пользователь является участником доверенного гильдии).