Richiesta di aiuto per la retrocessione di utenti con indirizzi email non validi

Per ragioni storiche, il mio importatore di Google+ ha importato gli utenti a TL1 per dare un vantaggio ai rifugiati di Google+. Sono importati con indirizzi email .invalid, e noi lo correggiamo quando accedono e vengono collegati al loro record utente esistente tramite il loro ID Google tramite l’autenticazione Google.

Ma ora il mio gruppo trust_level_1 è gonfio di migliaia di utenti che non hanno ancora seguito i loro contenuti, e se compaiono dopo alcuni anni (come a volte continuano a fare) non c’è motivo particolare di entrare come utenti Basic; dovrebbero essere utenti Nuovi. Il bootstrapping è ormai superato. Vorrei retrocedere quegli utenti che non hanno mai effettuato l’accesso a TL0 fino a quando non compariranno e daranno un’occhiata, e semplicemente affidarmi al normale processo di promozione.

Ho provato questo nella console Rails:

User.where(trust_level: 1) do |u|
    u.change_trust_level!(TrustLevel[0]) if !Email.is_valid?(u.primary_email&.email)
    u.save!
end

Ci sono voluti minuti consumando una CPU completa, ma non ha fatto nulla. (Ho provato anche altre varianti, come if !u.primary_email.is_valid? e if !Email.is_valid?(u.primary_email) e so che il vero problema è che tocco Ruby una volta all’anno o giù di lì…) Sono sicuro che mi sfugge qualcosa di ovvio per gli altri. Apprezzerei un suggerimento se qualcuno può trovarne uno!

2 Mi Piace

Mi mancava chiaramente .each

User.where(trust_level: 1).each do |u|
    u.change_trust_level!(TrustLevel[0]) if !Email.is_valid?(u.primary_email&.email)
    u.save!
end

Questo ha messo fuori uso il mio sito mentre era in esecuzione con un sacco di IO e non ha comunque apportato alcuna modifica. Quindi sto ancora facendo qualcosa di sbagliato e non sono poco preoccupato di continuare a provare questo sul sistema live. :smiling_face:

Ho capito che questo non è ciò che significa is_valid?. Quindi ora sto cercando la stringa letterale, e l’ho testata stampando l’indirizzo email. Vedo anche che change_trust_level salva già l’utente, quindi non ho bisogno di farlo due volte.

User.where(trust_level: 1).each do |u|
   if u.primary_email&.email.end_with?(".invalid")
     u.change_trust_level!(TrustLevel[0])
   end
end

Ma il numero di utenti in trust_level_1 ancora non cambia, quindi mi manca ancora qualcosa di importante.

Potresti usare il task di amministrazione di massa in questo caso?


Anche se ho appena testato il tuo secondo codice e ha funzionato per me sul mio utente di test (email: test_thirteen@here.invalid, era TL1 e ora è TL0).

User.where(trust_level: 1).each do |u|
   if u.primary_email&.email.end_with?(".invalid")
     u.change_trust_level!(TrustLevel[0])
   end
end
3 Mi Piace

Inizierei con il modello UserEmail e cercherei quelli con “invalid” nel loro indirizzo email e li scorrerei, ma non è qualcosa che posso capire esattamente dal mio telefono.

Se quegli indirizzi con “invalid” al loro interno fossero veramente non validi, allora non potrebbero essere salvati.

1 Mi Piace

Grazie!

Ho promosso manualmente alcuni utenti che erano già ben noti ai membri esistenti della community, quindi un ricalcolo di massa non avrebbe fatto quello che volevo. (Avevo trovato quella pagina mentre cercavo.)

Quest’ultima in realtà stava funzionando, come è successo a te. Il mio problema era che stavo guardando la pagina di panoramica dei gruppi /g e la stavo aggiornando, cercando che il conteggio del gruppo trust_level_1 diminuisse. Non mostrava un cambiamento nel conteggio mentre lo stavo eseguendo, quindi l’ho interrotto con control-C. Stamattina il gruppo trust_level_1 ha ora migliaia di membri in meno visualizzati in quella pagina. Quindi ora mi rendo conto che il conteggio lì è memorizzato nella cache e avrei dovuto fare clic su quella scheda e guardare il conteggio nella pagina /g/trust_level_1.

Ora capisco che avrei dovuto seguire con Group.ensure_consistency! per correggere i conteggi in quella pagina.

Ecco tutto, espresso in modo più conciso e idiomatico:

User.where(trust_level: 1).each do |u|
     u.change_trust_level!(TrustLevel[0]) if u.primary_email&.email.end_with?(".invalid")
end
Group.ensure_consistency!

Mi capita di avere una registrazione di alcuni utenti con solo un’email non valida che hanno effettivamente utilizzato il sito e soddisfatto i requisiti TL1. Non so come sia successo, ma per ora non mi interessa. Tutto ciò che mi interessa davvero è occuparmi della massa di migliaia, senza preoccuparmi delle poche eccezioni. Se succede a qualcun altro, questo ha funzionato per me:

User.where(trust_level: 1).each do |u|
  begin
     u.change_trust_level!(TrustLevel[0]) if u.primary_email&.email.end_with?(".invalid")
  rescue
  end
end
Group.ensure_consistency!
2 Mi Piace

Ecco il contesto:

script/import_scripts/friendsmegplus.rb

  def import_google_user(id, name)
    if !@emails[id].present?
      google_user_info = UserAssociatedAccount.find_by(provider_name: 'google_oauth2', provider_u
id: id.to_i)
      if google_user_info.nil?
        # crea un nuovo utente google sul sistema; ci si aspetta che questo utente venga unito
        # quando in seguito accederà con l'autenticazione google
        # Nota che poiché l'indirizzo email non è incluso nei dati G+, non sappiamo
        # se abbiano già un altro account non ancora associato a google ooauth2. Se non accedessero, avranno un
        # indirizzo @gplus.invalid associato al loro account
        email = "#{id}@gplus.invalid"

Ciò significa che mi interessa solo primary_email e non devo iniziare con UserEmail. Ho iniziato in quella direzione prima di rendermi conto che qualsiasi cosa cambiasse da primary_email non mi farebbe comunque volerli cambiare. Quindi qui si tratta molto specificamente di utenti la cui unica (quindi primaria) email termina letteralmente con .invalid — che è quello che ho fatto.

1 Mi Piace

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.