2013-05-24 15 views
5

In meinem Modell, das ich dieses:richtige Art zu verhindern, dass doppelte Datensätze in Rails

validates :name, :presence => true, :uniqueness => true 

In meinem Controller habe ich:

... 
if @location.save 
    format.html { redirect_to @location, :notice => 'Location was successfully created.' } 
    format.json { render :json => @location, :status => :created } 
... 

, die erfolgreich einen Datensatz erstellt, wenn es nicht bereits eine Notieren Sie sich diesen Namen in der Tabelle. Ich denke, es ist eine gute Übung, vor dem Einfügen eines möglicherweise doppelten Datensatzes zu prüfen, anstatt sich auf die DB-Einschränkungen zu verlassen.

Ich denke, ich sollte etwas zum Controller hinzufügen, um zu überprüfen? Was ist der richtige Weg, dies zu tun?

Vielen Dank.

Antwort

6

Die Validierung wird von Rails durchgeführt, bevor der Datensatz die Datenbank trifft. Wenn der Datensatz eine Überprüfung nicht besteht, wird er nicht gespeichert, und .save gibt false zurück, wodurch die else-Klausel Ihres Controllers ausgeführt wird. Diese Klausel gibt die übermittelte Seite in der Regel erneut, wobei die Fehler angezeigt werden, damit sie korrigiert werden können.

Angenommen, Ihr Controller ist so aufgebaut, Sie müssen nichts anderes tun. Sie sollten natürlich sicherstellen, dass alle Datenbankeinschränkungen in Ihren Validierungen widergespiegelt werden. Andernfalls könnte ein Datensatz zwar Validierungen bestehen, aber einen Fehler verursachen, wenn eine Einschränkung beim Speichern verletzt wird.

5

Sie müssen nichts im Controller tun.

The correct way to prevent duplicate records in Rails is used 
validation in model which you did correctly. 
2

Sie haben die korrekte Möglichkeit, die Eindeutigkeit in Rails zu validieren, und zwar anhand von Validierungen. Sie müssen dies nicht im Controller überprüfen, da dies die Validierung für Sie ist.

Beachten Sie, dass das Hinzufügen einer Eindeutigkeitsprüfung nicht garantiert, dass Sie einen eindeutigen Datensatz in der Datenbank haben. Dies wird schön in der validates_uniqueness_of documentation in der API erklärt.

6

Fügen Sie einen eindeutigen Index in Ihre Datenbank ein. Wenn also etwas durch die Modellvalidierungen rutscht (selten, aber technisch möglich), schlägt die Abfrage fehl, die in der Datenbank gespeichert werden soll.

4

Ihre Validierung ist korrekt. Genau wie alle anderen oben genannten Antworten, vorausgesetzt, Sie möchten mehrere Felder validieren, zum Beispiel unter der Annahme, dass Sie eine Wunschliste haben, die die user_id und die item_id dauert, müssen Sie jedes Element nur einmal von einem Benutzer für diese Art von Szenario hinzufügen fügen Sie diese Art der Validierung zu Ihrem Modell

Class class_name < ActiveRecord::Base 
    validates_uniqueness_of :item_id, scope: :user_id 
end 
+0

Sie können 'bestätigt: ITEM_ID, Einzigartigkeit: {Gültigkeitsbereich: user_id}' bezüglich http://www.rubydoc.info/github/bbatsov/rubocop/Rubocop/Cop/Schienen/Validierung – Math

Verwandte Themen