Szyny: sprawdzanie niepowtarzalności dwóch kolumn (razem)

Odpowiedzi:

230

Z opcją możesz skorzystać z weryfikacji unikalnościscope .

Powinieneś także dodać unikalny indeks do bazy danych, aby zapobiec przejściu walidacji przez nowe rekordy, gdy są sprawdzane w tym samym czasie przed zapisaniem:

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
źródło
+1 dla indeksu, ale -1 dla, uniqueponieważ nie jest rozpoznawany. W tej części użyłem odpowiedzi poniżej.
Aleks
7
Tak, przepraszam, klucz weryfikacyjny powinien być uniqueness, nie unique. Zobacz załączoną dokumentację. Naprawianie odpowiedzi.
skompresowania
1
Hm, fajnie, dzięki :) Powtarzam się - wstawienie indeksu przenosi rozwiązanie na wyższy poziom, a nie tylko tak, jak inne rozwiązania „kodowania”, na które wpadałem, zanim znajdę tę odpowiedź. +1 za to
Aleks
70

We wszystkich powyższych odpowiedziach brakuje sposobu sprawdzenia wyjątkowości wielu atrybutów w modelu. Poniższy kod ma na celu wyjaśnienie, jak używać wielu atrybutów w zakresie.

validates :country, uniqueness: { scope: [:medium, :another_medium] }

Sprawdza niepowtarzalność countrywe wszystkich wierszach z wartościami mediumi another_medium.

Uwaga: Nie zapomnij dodać indeksu do powyższej kolumny, zapewnia to szybkie wyszukiwanie i dodaje walidację na poziomie bazy danych dla unikalnych rekordów.

Aktualizacja: do dodawania indeksu podczas tworzenia tabeli

t.index [:medium, :another_medium], unique: true
Aamir
źródło
41

Możesz przekazać :scopeparametr do swojego walidatora w następujący sposób:

validates_uniqueness_of :medium, scope: :country

Więcej przykładów znajdziesz w dokumentacji .

KM Rakibul Islam
źródło
8
@DennisBest To „działa”, ale nie chroni przed warunkami wyścigu. Jeśli dwóch klientów wysyła jednocześnie żądania, obaj mogą przejść weryfikację, jeśli żaden z nich nie zostanie zatwierdzony w bazie danych, zanim drugi zostanie sprawdzony. Potrzebujesz również ograniczenia unikalności bazy danych, tak jak w odpowiedzi tompave.
pies pasterski