Ich bin derzeit Benutzerdaten von einer SAML-Assertion bekommen und Benutzer in einem lokalen DB auf der Grundlage dieser Informationen erstellen:Ruby on Rails/Active: Datensätze mit first_or_initialize Aktualisierung verursacht RecordNotUnique
mapped_role = map_role user_role
user = User.where(email: auth_attrs.single('Email')).first_or_initialize do |u|
u.firstname = auth_attrs.single('First Name')
u.uid = auth_attrs.single('UID')
u.provider = resp.provider
u.role = mapped_role
end
Das funktioniert gut genug, Wenn sich jedoch die Benutzerdetails ändern (z. B. ihre Rolle ändert sich), werden diese Daten nicht in der Datenbank aktualisiert. Was ich versucht habe, ist das Verschieben der Rollenzuordnung aus dem do
Block (auf dem user
Objekt, das von first_or_initialize
zurückgegeben wird) und dann Aufruf einer Folge user.save
, aber dies führt zu einem ziemlich roten Bildschirm, der mir mitteilt, dass die Spalte 'E-Mail' ist nicht einzigartig. Ich möchte hier keinen neuen Datensatz erstellen, sondern nur einen vorhandenen aktualisieren. Gibt es hier ein besseres Muster?
Edit: Ich habe versucht die verschiedenen Ansätze here ausgelegt, aber sie führen zu den gleichen SQLite3 Fehler. Es scheint, als würde ich etwas vermissen.
Edit2: Es sieht so aus, als ob Devise versucht, etwas hinter den Kulissen mit einem eigenen E-Mail-Feld (?) Zu tun.
Ich werde dies als richtig markieren, da es die gestellte Frage löst. Ich glaube, mein Problem hatte damit zu tun, dass Devise in meinen Benutzertisch eingegriffen hat und Chaos angerichtet hat. –