Schienen: Validierung der Eindeutigkeit von zwei Spalten (zusammen)

Antworten:

230

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
tompave
quelle
+1 für den Index, aber -1 für den, uniqueda er nicht erkannt wird. Für diesen Teil habe ich die Antwort unten verwendet.
Aleks
7
Ja, sorry, der Validierungsschlüssel sollte uniquenessnicht sein unique. Siehe die verknüpfte Dokumentation. Die Antwort korrigieren.
Tompave
1
Hm, nett, danke :) Um mich zu wiederholen - das Setzen des Index bringt die Lösung auf die nächste Ebene und nicht nur wie andere "Codierungs" -Lösungen, auf die ich gestoßen bin, bevor ich diese Antwort finde. +1 dafür
Aleks
70

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
Aamir
quelle
41

Sie können einen :scopeParameter wie folgt an Ihren Validator übergeben:

validates_uniqueness_of :medium, scope: :country

Weitere Beispiele finden Sie in der Dokumentation .

KM Rakibul Islam
quelle
8
@ TennisBest Es "funktioniert", schützt aber nicht vor Rennbedingungen. Wenn zwei Clients gleichzeitig Anforderungen stellen, können beide die Validierung bestehen, wenn keiner der beiden in die Datenbank übernommen wird, bevor der andere validiert wird. Sie benötigen auch eine eindeutige Datenbankbeschränkung wie in der Antwort von tompave.
Suppenhund