Ich habe ein Release
Modell mit medium
und country
Spalten (unter anderem). Es sollte keine releases
identischen medium
/ country
Kombinationen geben.
Wie würde ich dies als Schienenvalidierung schreiben?
Ich habe ein Release
Modell mit medium
und country
Spalten (unter anderem). Es sollte keine releases
identischen medium
/ country
Kombinationen geben.
Wie würde ich dies als Schienenvalidierung schreiben?
Antworten:
Mit dieser Option können Sie eine Eindeutigkeitsüberprüfung verwendenscope
.
Außerdem sollten Sie der Datenbank einen eindeutigen Index hinzufügen, um zu verhindern, dass neue Datensätze die Überprüfungen bestehen, wenn sie gleichzeitig überprüft werden, bevor sie geschrieben werden:
class AddUniqueIndexToReleases < ActiveRecord::Migration
def change
add_index :releases, [:country, :medium], unique: true
end
end
class Release < ActiveRecord::Base
validates :country, uniqueness: { scope: :medium }
end
unique
da er nicht erkannt wird. Für diesen Teil habe ich die Antwort unten verwendet.
uniqueness
nicht sein unique
. Siehe die verknüpfte Dokumentation. Die Antwort korrigieren.
In allen oben genannten Antworten fehlt, wie die Eindeutigkeit mehrerer Attribute in einem Modell überprüft werden kann. Der folgende Code soll erläutern, wie mehrere Attribute in einem Bereich verwendet werden.
validates :country, uniqueness: { scope: [:medium, :another_medium] }
Es überprüft die Eindeutigkeit von country
in allen Zeilen mit den Werten von medium
und another_medium
.
Hinweis: Vergessen Sie nicht, einen Index für die obige Spalte hinzuzufügen. Dies gewährleistet einen schnellen Abruf und fügt eine Validierung auf DB-Ebene für eindeutige Datensätze hinzu.
Update: Zum Hinzufügen eines Index beim Erstellen einer Tabelle
t.index [:medium, :another_medium], unique: true
Sie können einen :scope
Parameter wie folgt an Ihren Validator übergeben:
validates_uniqueness_of :medium, scope: :country
Weitere Beispiele finden Sie in der Dokumentation .