¿Hay una manera de cambiar masivamente los 'nombres' de usuario (nota: no nombres de usuario)?

Tenemos varios cientos de usuarios en nuestro foro cuyos nombres (no nombres de usuario, nombres) se establecieron inadvertidamente como su dirección de correo electrónico debido a la configuración del proveedor externo de SSO (a través de WordPress) al crear sus cuentas.

¿Existe una forma relativamente sencilla de cambiar en masa esos nombres de the_name@example.com a the_name (es decir, truncar todo lo que viene después de ‘@’) sin tener que entrar manualmente en cada perfil y modificarlos uno por uno?

Puedes hacerlo desde la consola de Rails. Es más complicado de explicar aquí, especialmente porque las direcciones de correo ya no están en el registro del usuario. Si tienes un presupuesto, puedes publicar en Marketplace o contactarme directamente.

O bien, si no te importa la dirección de correo real…

Algo así como

users = User.where('username LIKE', '%@%')

Luego iterarías sobre los resultados y usarías gsub para eliminar todo desde el @ hasta el final. Lo mejor que puedo hacer desde mi teléfono.

Agradezco la respuesta, @pfaffman. Puedo escribir el SQL, pero trabajar en la consola de Rails está un poco fuera de mi alcance. ¿Cómo puedo acceder a la consola de Python de Discourse? :slightly_smiling_face:

Sería genial, aunque entiendo que también podría ser potencialmente peligroso, si hubiera una herramienta como el explorador de datos que también permitiera escribir una consulta UPDATE.

¿Alguien sabe si hay alguna manera de conectar una herramienta SQL de terceros (como Sequel Pro o equivalente) a la base de datos en ejecución en Discourse autoalojado con Docker?

Sí, pero hacerlo en Rails hace que sea mucho más difícil estropear tu base de datos. Por ejemplo, si lo haces con Rails, sabrás que no creaste nombres de usuario ilegales (y si alguna otra tabla necesita actualizarse cuando cambias la que estás modificando, Rails lo hará; SQL no).

cd /var/discourse
./launcher enter app
rails c

Ahora estás en Rails.

users=User.where("username like '%@%'")
users.each do |user|
  user.name.gsub!(/@(.*)/,"")
  puts "Nuevo nombre: #{user.name}"
  # user.save
end

Creo que eso hará lo que necesitas. Si parece que funciona, puedes descomentar user.save y probar suerte.

Haz una copia de seguridad primero, ¿vale? (O, mejor aún, en un servidor de staging.)

¡Guau, gracias por el código!

No tengo un servidor de pruebas para esta instancia de Discourse, pero puedo hacer una copia de seguridad y luego ejecutar el código muy temprano mañana por la mañana, cuando probablemente no haya mucho (o ningún) tráfico, para poder restaurar inmediatamente si surge algún problema.

Muchas gracias, @pfaffman.

Deberías estar bastante seguro si los puts parecen bien. ¡Saludos!

Recortar en el @ sigue dejando la información personal (dirección de correo electrónico) mayormente visible para el Gran Malvado Internet (dado que la mayoría de las personas usan @gmail.com o unos pocos proveedores grandes más). Probablemente te convenga más establecerlas con el mismo valor que el nombre de usuario.

Gracias @lionel-rowe, es un buen punto. Los nombres de usuario ya son ese mismo valor (el nombre de usuario se creó tomando todo lo anterior al ‘@’ de la dirección de correo electrónico del usuario).

El horror.

Tuve que hacer un pequeño cambio en el código y agregar un procedimiento para que funcionara. Aquí está el código modificado:

users=User.where("name like '%@%'")

Luego, la consola de Rails comenzó a mostrarte los datos de los usuarios con “more”, así que tuve que salir con q. Entonces:

users.each do |user|
  user.name.gsub!(/@(.*)/,"")
  puts "Nuevo nombre: #{user.name}"
  # user.save
end

La consola de Rails me mostró la lista de nuevos nombres (¡correctos!) y luego me devolvió a un “more” de los usuarios. q otra vez.

Entonces:

users.each do |user|
  user.name.gsub!(/@(.*)/,"")
  puts "Nuevo nombre: #{user.name}"
  user.save
end

…y ya no hay nombres de usuario con direcciones de correo electrónico y todo se ve bien en la interfaz del foro.

Gracias de nuevo, @pfaffman, por tu generosa ayuda.