C'è un modo per modificare in blocco i 'nomi' degli utenti (nota: non i nomi utente)

Abbiamo alcune centinaia di utenti sul nostro forum i cui nomi (non i nomi utente, i nomi) sono stati impostati per errore sul loro indirizzo email a causa di come è stato configurato il provider SSO esterno (tramite WordPress) al momento della creazione dei loro account.

Esiste un modo relativamente semplice per modificare in blocco questi nomi da the_name@example.com a the_name (ovvero troncare tutto ciò che segue ‘@’) senza dover accedere manualmente a ogni profilo e modificarli uno per uno?

Puoi farlo dalla console di Rails. È più complicato di quanto si possa spiegare qui, soprattutto perché gli indirizzi email non sono più nel record dell’utente. Se hai un budget, puoi pubblicare in Marketplace o contattarmi direttamente.

Oppure, se non ti importa dell’indirizzo email effettivo…

Qualcosa del genere:

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

Poi itereresti e useresti gsub per rimuovere tutto dall’@ alla fine. È il meglio che posso fare dal mio telefono.

Apprezzo la risposta @pfaffman. Posso scrivere l’SQL, ma lavorare nella console di Rails è un po’ fuori dalla mia sfera di competenza. Come posso accedere alla console Python di Discourse :slightly_smiling_face:?

Sarebbe bello, anche se capisco che potrebbe essere potenzialmente pericoloso, avere uno strumento simile all’Esploratore dati che permetta anche di scrivere query UPDATE.

Qualcuno sa se esiste un modo per collegare uno strumento SQL di terze parti (come Sequel Pro o equivalente) al database in esecuzione in Discourse self-hosted su Docker?

Sì, ma farlo in Rails rende molto più facile evitare di danneggiare il tuo database. Ad esempio, se lo fai con Rails, saprai di non aver creato nomi utente illegali (e se qualche altra tabella deve essere aggiornata quando modifichi quella su cui stai lavorando, Rails lo farà automaticamente, mentre l’SQL no).

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

Ora sei nella console di Rails.

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

Penso che questo faccia ciò che desideri. Se sembra funzionare, puoi decommentare user.save e provare.

Fai prima un backup, OK? (O meglio ancora, su un server di staging.)

Wow, grazie per il codice!

Non ho un server di staging per questa istanza di Discourse, ma posso fare un backup ed eseguire il codice domani mattina molto presto, quando è probabile che ci sia poco (o nessun) traffico, così da poter ripristinare immediatamente in caso di problemi.

Grazie mille @pfaffman.

Dovresti essere abbastanza al sicuro se i puts sembrano a posto. Saluti!

Tagliare alla @ lascia comunque gran parte delle informazioni personali (indirizzo email) visibili al Grande Cattivo Internet (considerando che la maggior parte delle persone usa @gmail.com o pochi altri grandi provider). Sarebbe meglio impostarli allo stesso valore dell’username.

Grazie @lionel-rowe, è un buon punto. Tuttavia, i nomi utente hanno già quel valore (il nome utente è stato creato prendendo tutto ciò che precede ‘@’ dall’indirizzo email dell’utente).

L’orrore.

Ho dovuto apportare una piccola modifica al codice e aggiungere una procedura per farlo funzionare. Ecco il codice modificato:

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

Poi la console di Rails ha iniziato a mostrarti i dati degli utenti pagina per pagina, quindi ho dovuto premere q per uscire. Poi:

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

La console di Rails mi ha mostrato l’elenco dei nuovi nomi (corretti!), per poi riportarmi a una visualizzazione “more” degli utenti. q di nuovo.

Poi:

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

…e niente più nomi utente con indirizzi email, e tutto appare corretto nella parte frontend del forum.

Grazie ancora @pfaffman per il tuo generoso aiuto.