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?
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.)
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.
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).