classSchool<ActiveRecord::Base
validates_uniqueness_of :name
end
Zum Beispiel, nachdem ich hinzufügen „Yale“, kann ich nicht „Yale“ hinzufügen , aber kann hinzufügen „yale.“ Wie kann ich den Validierungsfall unempfindlich machen?
validates_uniqueness_of :name, :case_sensitive => falsemacht den Trick, aber Sie sollten bedenken, dass validates_uniqueness_ofdies keine Eindeutigkeit garantiert, wenn Sie mehrere Server / Serverprozesse (z. B. Phusion Passenger, mehrere Mongrels usw.) oder einen Multithread-Server haben. Das liegt daran, dass Sie möglicherweise diese Abfolge von Ereignissen erhalten (die Reihenfolge ist wichtig):
Prozess A erhält die Anforderung, einen neuen Benutzer mit dem Namen 'foo' zu erstellen.
Prozess B macht dasselbe
Prozess A überprüft die Eindeutigkeit von 'foo', indem er die Datenbank fragt, ob dieser Name noch vorhanden ist, und die Datenbank sagt, dass der Name noch nicht vorhanden ist.
Prozess B macht das Gleiche und erhält die gleiche Antwort
Prozess A sendet die insertAnweisung für den neuen Datensatz und ist erfolgreich
Wenn Sie eine Datenbankeinschränkung haben, die eine Eindeutigkeit für dieses Feld erfordert, sendet Prozess B die insertAnweisung für den neuen Datensatz und schlägt mit einer hässlichen Serverausnahme fehl , die vom SQL-Adapter zurückkommt. Wenn Sie keine Datenbankeinschränkung haben, ist die Einfügung erfolgreich und Sie haben jetzt zwei Zeilen mit dem Namen 'foo'.
... trotz seines Namens garantiert validates_uniqueness_of nicht wirklich, dass Spaltenwerte eindeutig sind. Sie können lediglich überprüfen, ob keine Spalte den gleichen Wert hat wie der Datensatz, der zum Zeitpunkt der Validierung validiert wird. Es ist möglich, dass zwei Datensätze gleichzeitig erstellt werden, jeder mit demselben Wert für eine Spalte, die eindeutig sein soll, und dass beide Datensätze die Validierung bestehen. Der zuverlässigste Weg, um die Eindeutigkeit durchzusetzen, ist eine Einschränkung auf Datenbankebene. "
Eine Möglichkeit, wie dies häufig vorkommt, sind versehentliche doppelte Übermittlungen von einer Webseite beim Erstellen eines neuen Kontos. Dies ist schwer zu lösen, da der Benutzer den zweiten (hässlichen) Fehler zurückerhält und denkt, dass die Registrierung fehlgeschlagen ist, obwohl dies in Wirklichkeit erfolgreich war. Der beste Weg, dies zu verhindern, besteht darin, Javascript zu verwenden, um eine doppelte Übermittlung zu verhindern.
Ich mache Rails seit über 10 Jahren. Ich kann nicht glauben, dass ich gerade etwas über diese Option lerne. In Rails gibt es immer etwas Neues zu lernen ... unabhängig von der Fähigkeitsstufe.
Danielricecodes
24
Es gibt eine Option, bei der Sie die Groß- und Kleinschreibung nicht angeben können
In Schienen 3 können Sie dies in Ihrem Modell tun:
oder ohne case_sensitivity
quelle
Es gibt eine Option, bei der Sie die Groß- und Kleinschreibung nicht angeben können
quelle
Es gibt eine ähnliche Frage, aber die Antwort ist interessanter: https://stackoverflow.com/a/6422771
Grundsätzlich führt using
:case_sensitive => false
eine sehr ineffiziente Datenbankabfrage durch.quelle