Eso resolvió el error. Asumo que, como no podía encontrar la clase antes, la estaba tratando como una constante? De todos modos, eso lo ha solucionado, brillante, ¡muchas gracias! ¡Ya estoy desatascado!
La razón por la que tenía esto:
user.approved = true
user.approved_by_id = Discourse.system_user.id
antes de:
reviewable.perform(:approve, Discourse.system_user)
es porque la adición a la cola de revisión es asíncrona. En el trabajo, la revisión solo se crea si approve es falso (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
}
)
¿Existe el riesgo de que el trabajo se ejecute después de que hayas comprobado la entrada de revisión?
El resultado es que la entrada de revisión parece no existir, pero el trabajo simplemente está esperando para ejecutarse. Luego el trabajo se ejecuta y crea la entrada de revisión, y has perdido la oportunidad de eliminarla porque tu código para probar esto ya se había ejecutado.
¿Es una condición de carrera potencial?
Establece approved en true antes de verificar la entrada de revisión y habrás resuelto el problema (porque una revisión nunca se creará después de esto, ya que es una dependencia).
Me encontré con este problema al probar mi código: en desarrollo funcionaba, pero en producción falló porque las cosas se ejecutaron en un orden diferente.
Nota: Agradezco que no hayas escrito esto para soportar este caso de uso, pero creo que es importante permitir que los plugins puedan aprobar automáticamente a nuevos usuarios en circunstancias especiales (por ejemplo, como el plugin de Discord que lo hace si el usuario es miembro de un gremio de confianza).