Mam Release
model z medium
i country
kolumny (między innymi). Nie powinno być takich releases
wspólnych medium
/ country
kombinacji.
Jak napisałbym to jako walidację szyn?
Mam Release
model z medium
i country
kolumny (między innymi). Nie powinno być takich releases
wspólnych medium
/ country
kombinacji.
Jak napisałbym to jako walidację szyn?
Odpowiedzi:
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
unique
ponieważ nie jest rozpoznawany. W tej części użyłem odpowiedzi poniżej.
uniqueness
, nie unique
. Zobacz załączoną dokumentację. Naprawianie odpowiedzi.
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ść country
we wszystkich wierszach z wartościami medium
i 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
Możesz przekazać :scope
parametr do swojego walidatora w następujący sposób:
validates_uniqueness_of :medium, scope: :country
Więcej przykładów znajdziesz w dokumentacji .