2016-05-28 11 views
1

Ich möchte Eindeutigkeit auf einer Spalte (Typ Zeichenfolge), aber das Problem ist auf einige der Strings, die ich Teil des Anfangs abgeschnitten, bevor Sie sie in die Datenbank mit einer Funktion und before_save einfügen . Daher funktioniert die Überprüfung der Eindeutigkeit von Einträgen nicht, da die Eingabe sich von der in der Datenbank unterscheidet, obwohl sie nach der Kürzung/Formatierung identisch sein sollten.Rails - Benutzerdefinierte Validierung der Eindeutigkeit

Ich möchte in der Lage sein, meine Zeichenfolge zuerst abzuschneiden, dann ihre Eindeutigkeit zu überprüfen, aber ich bin mir nicht sicher, ob es möglich ist, die Schienen validates uniqueness: true zu verwenden. Muss ich einfach eine benutzerdefinierte validate schreiben?

Antwort

2

Die Reihenfolge der Rails-Callback ist:

(-) speichern

(-) gültig

(1) before_validation

(-) validieren

(2) after_validation

(3) BEFORE_SAVE

(4) before_create

(-) erstellen

(5) after_create

(6) after_save

(7) after_commit

Das Detail ist here. Sie tun also einfach etwas wie:

validates :your_data_field, uniqueness: true 
before_validation :normalize_data 

def normalize_data 
    # Normalize your data here 
end 

So funktioniert es genau wie Sie beschrieben, und müssen nicht schreiben und benutzerdefinierte Validierung. Es wird schöner!

1

Wie Sie bereits erwähnt haben, möchten Sie einen benutzerdefinierten Validator erstellen und validates_with verwenden. Informationen über das heißt hier:

http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_with

DRY Prinzipien zu folgen, und auch keine Änderungen an der Abschneidelogik, um sicherzustellen, werden sowohl Ihre Validator und Ihre BEFORE_SAVE Rückruf reflektiert, schlage ich vor, ein Verfahren zu schaffen, die die abgeschnittenen zurückgibt string, und verwenden Sie diese Methode innerhalb des Validators und des Callbacks.