Aus historischen Gründen importierte mein Google+ Importer Benutzer auf TL1, um Google+ Flüchtlingen einen Vorsprung zu verschaffen. Sie werden mit ungültigen E-Mail-Adressen importiert und wir beheben dies, wenn sie sich anmelden und über ihre Google ID über die Google-Authentifizierung mit ihrem bestehenden Benutzerkonto verknüpft werden.
Aber jetzt ist meine trust_level_1 Gruppe mit Tausenden von Benutzern aufgebläht, die ihren Inhalten noch nicht gefolgt sind, und wenn sie nach ein paar Jahren auftauchen (wie sie es manchmal weiterhin tun), gibt es keinen besonderen Grund, als Basic-Benutzer einzusteigen; sie sollten neue Benutzer sein. Der Start ist lange vorbei. Ich möchte diese nie angemeldeten Benutzer auf TL0 herabstufen, bis sie auftauchen und sich umsehen, und mich einfach auf den normalen Beförderungsprozess verlassen.
Ich habe dies in der Rails-Konsole versucht:
User.where(trust_level: 1) do |u|
u.change_trust_level!(TrustLevel[0]) if !Email.is_valid?(u.primary_email&.email)
u.save!
end
Es dauerte Minuten und verbrauchte eine volle CPU, tat aber nichts. (Ich habe auf dem Weg dorthin auch andere Variationen ausprobiert, wie if !u.primary_email.is_valid? und if !Email.is_valid?(u.primary_email) und ich weiß, dass das eigentliche Problem ist, dass ich Ruby nur einmal im Jahr berühre…) Ich bin sicher, dass ich etwas Offensichtliches übersehe. Ich würde mich über einen Hinweis freuen, wenn jemand einen hat!
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
Dies hat meine Website zum Absturz gebracht, während sie mit viel IO lief, und hat trotzdem keine Änderung bewirkt. Ich mache also immer noch etwas falsch und bin nicht wenig besorgt, dies weiterhin auf dem Live-System zu versuchen.
Ich habe herausgefunden, dass dies nicht bedeutet, was is_valid? bedeutet. Ich suche also jetzt nach der wörtlichen Zeichenfolge und habe das getestet, indem ich die E-Mail-Adresse ausgedruckt habe. Außerdem sehe ich, dass change_trust_level den Benutzer bereits speichert, sodass ich das nicht zweimal tun muss.
User.where(trust_level: 1).each do |u|
if u.primary_email&.email.end_with?(".invalid")
u.change_trust_level!(TrustLevel[0])
end
end
Aber die Anzahl der Benutzer in trust_level_1 ändert sich immer noch nicht, also fehlt mir immer noch etwas Wichtiges.
Könnten Sie in diesem Fall die Massenadministrationsaufgabe verwenden?
Obwohl ich gerade Ihren zweiten Code getestet habe und er für mich bei meinem Testbenutzer (E-Mail: test_thirteen@here.invalid, war TL1 und ist jetzt TL0) funktioniert hat.
User.where(trust_level: 1).each do |u|
if u.primary_email&.email.end_with?(".invalid")
u.change_trust_level!(TrustLevel[0])
end
end
Ich würde mit dem UserEmail-Modell beginnen und diejenigen finden, die „invalid“ in ihrer E-Mail-Adresse haben, und durch diese iterieren, aber das ist nichts, was ich auf meinem Handy genau herausfinden kann.
Wenn diese Adressen mit „invalid“ darin tatsächlich ungültig wären, dann könnten sie nicht gespeichert werden.
Ich habe einige Benutzer, die den bestehenden Community-Mitgliedern bereits bekannt waren, manuell befördert, sodass eine Massenberechnung nicht das gewünschte Ergebnis erzielt hätte. (Ich habe diese Seite tatsächlich beim Suchen gefunden.)
Das Letzte hat tatsächlich funktioniert, so wie es bei Ihnen auch der Fall war. Mein Problem war, dass ich mir die Übersichtsseite der /g-Gruppen angesehen und sie aktualisiert habe und darauf wartete, dass die Anzahl der Mitglieder in der trust_level_1-Gruppe abnimmt. Sie zeigte keine Änderung der Anzahl an, während ich sie ausführte, also habe ich sie mit Strg+C beendet. Heute Morgen hat die trust_level_1-Gruppe nun Tausende weniger Mitglieder auf dieser Seite angezeigt. Jetzt verstehe ich, dass die dortige Anzahl zwischengespeichert wird und ich hätte auf die Karte klicken und die Anzahl auf der Seite /g/trust_level_1 überprüfen sollen.
Jetzt verstehe ich, dass ich Group.ensure_consistency! hätte ausführen sollen, um die Zählungen auf dieser Seite zu korrigieren.
Hier ist das Ganze, kompakter und idiomatischer ausgedrückt:
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!
Es ist zufällig, dass ich Aufzeichnungen über einige Benutzer mit nur einer ungültigen E-Mail-Adresse habe, die tatsächlich die Website genutzt und die TL1-Anforderungen erfüllt haben. Ich weiß nicht, wie das passiert ist, aber im Moment ist es mir egal. Alles, was mich wirklich interessiert, ist die Bewältigung der Masse von Tausenden, ohne mich um die wenigen Ausnahmen zu kümmern. Wenn das jemand anderem passiert, hat Folgendes für mich funktioniert:
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!
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?
# Erstelle neuen Google-Benutzer im System; erwarte, dass dieser Benutzer zusammengeführt wird,
# wenn er sich später mit Google-Authentifizierung anmeldet
# Beachte, dass, da die E-Mail-Adresse nicht in den G+-Daten enthalten ist, wir
# nicht wissen, ob sie bereits ein anderes Konto haben, das noch nicht mit
# Google OAuth2 verknüpft ist. Wenn sie sich nicht angemeldet haben, haben sie eine
# @gplus.invalid-Adresse, die mit ihrem Konto verknüpft ist
email = "#{id}@gplus.invalid"
Das bedeutet, dass ich mich nur für primary_email interessiere und nicht mit UserEmail beginnen muss. Ich habe diesen Weg eingeschlagen, bevor ich erkannte, dass alles, was dies von primary_email ändert, dazu führen würde, dass ich sie sowieso nicht ändern möchte. Hier handelt es sich also sehr spezifisch um Benutzer, deren einzige (somit primäre) E-Mail-Adresse buchstäblich mit .invalid endet – und das habe ich auch so umgesetzt.