14

Ich habe ein Modell, das zwei Felder hat, die ich Vorname und Nachname nennen werde, und ich möchte sicherstellen, dass die Kombination der beiden Groß-und Kleinschreibung nicht eindeutig sind. Ich habe durch die Verwendung dieses halben Weg bekommen:Rails validates_uniqueness_of über mehrere Spalten mit case-insensitivity

validates_uniqueness_of :first_name, :scope => :last_name 

Das Problem ist, dass die Einzigartigkeit Prüfung scheint empfindlich zu sein Fall, auch wenn the documentation sagt es Groß- und Kleinschreibung standardmäßig sein sollte. So einen vorhandenen Datensatz gegeben:

{ :first_name => 'John', :last_name => 'Smith' } 

Dies wird erlaubt:

{ :first_name => 'JOHN', :last_name => 'SMITH' } 

sowie alle zusätzlichen Datensatz, in dem es eine Variation von Fall entweder in der ersten oder Nachnamen. Warum sind diese Aufzeichnungen erlaubt? Wie kann ich die Groß-/Kleinschreibung in beiden Feldern unabhängig von Groß- und Kleinschreibung durchsetzen?

Antwort

21

Haben Sie versucht validates_uniqueness_of :first_name, :scope => :last_name, :case_sensitive => false?

Die documentation says es ist standardmäßig wahr.

(ich glaube, der Link zu einem gewissen veraltete Dokumentation gab ist. IIRC, die Standardeinstellung für diese tat Änderung in den letzten paar Jahren.)

+0

Du hast Recht! Die Dokumentation, die ich gefunden habe, hat mich in die Irre geführt. Die Einstellung ': case_sensitive => false' hat es für den ersten_namen funktionieren lassen, funktioniert aber nicht in die andere Richtung. Es akzeptiert immer noch '{: first_name => 'John',: last_name => 'SMITH'}'. Gibt es einen Weg, um es in beide Richtungen funktionieren zu lassen? Würde ich nur zwei "validates_uniqueness_of" -Regeln mit dem vertauschten Feld einschließen? –

+0

Ich habe versucht, eine weitere Validierung mit den beiden vertauschten Feldern hinzuzufügen. Es fängt jetzt Fälle ein, in denen eines der Felder unterschiedlich verkettet ist, aber nicht, wenn beide es sind, so dass es immer noch durchkommt: '{: first_name => 'JOHN',: last_name => 'SMITH'}'. –

+1

Ich würde an dieser Stelle nur eine benutzerdefinierte Validierungsmethode schreiben, wenn ich Sie wäre. –