Ich habe ein ReleaseModell mit mediumund countrySpalten (unter anderem). Es sollte keine releasesidentischen medium/ countryKombinationen geben.
Wie würde ich dies als Schienenvalidierung schreiben?
Ich habe ein ReleaseModell mit mediumund countrySpalten (unter anderem). Es sollte keine releasesidentischen medium/ countryKombinationen 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
uniqueda er nicht erkannt wird. Für diesen Teil habe ich die Antwort unten verwendet.
uniquenessnicht 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 countryin allen Zeilen mit den Werten von mediumund 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 :scopeParameter wie folgt an Ihren Validator übergeben:
validates_uniqueness_of :medium, scope: :country
Weitere Beispiele finden Sie in der Dokumentation .