rails 3 sprawdzanie unikalności wielu atrybutów


177

Używam Rails 3.0.0.beta4

Chcę dodać walidację na wyjątkowość na dwóch atrybutów, to znaczy, że mój model jest ważny, jeżeli para 'recorded_at'i 'zipcode'jest wyjątkowy.

Jednym atrybutem jest tutaj składnia

validates :zipcode, :uniqueness => true

dzięki

Odpowiedzi:


333

W Railsach 2 napisałbym:

validates_uniqueness_of :zipcode, :scope => :recorded_at

W Rails 3:

validates :zipcode, :uniqueness => {:scope => :recorded_at}

W przypadku wielu atrybutów:

validates :zipcode, :uniqueness => {:scope => [:recorded_at, :something_else]}

7
Powiedziałbym, że logicznie bardziej sensowne jest stwierdzenie, że wymagasz recorded_atunikalności w zakresie kodu pocztowego. validate :recorded_at, : uniqueness => { :scope => :zipcode }
Ariejan

2
nadal możesz to zrobić za pomocą szyn na 2 sposoby i uważam, że jest to bardziej czytelne, chyba że wykonujesz kilka typów walidacji na tej samej właściwości.
zem

24
czy zatwierdziłbyś grupę trzech z validates :zipcode, :uniqueness => {:scope => [:recorded_at, :something_else]}?
Greg Guida,

5
Dodam, że jeśli chcesz korzystać z :scopekluczy obcych, trzeba używać :fkey_idsymboli, zamiast :fkeynich, nawet jeśli „Basic” :uniquenessdziała na:fkey
nbarraille

1
Prawdopodobnie chcesz dodać niestandardową wiadomość o błędzie, taką jak, :message => ' is taken for this recorded date'
laffuste

96

Wiele parametrów zakresu:

class TeacherSchedule < ActiveRecord::Base
  validates_uniqueness_of :teacher_id, :scope => [:semester_id, :class_id]
end

http://apidock.com/rails/ActiveRecord/Validations/ClassMethods/validates_uniqueness_of

To powinno odpowiedzieć na pytanie Grega.


Greg wydawał się bardziej zainteresowany użyciem skrótu „zatwierdzanie”, więc szybsza odpowiedź na jego pytanie brzmi „tak”
elc

Jest to dość ważne, aby wiedzieć, szukałem dokładnie tego, czy powinienem używać _id (lub nie) podczas sprawdzania skojarzeń w zakresach.
Francesco Belladonna

Ta odpowiedź działa w Railsach 4.1.6 validates_uniqueness_of: cart_id, scope: [: location_id,: plug_id]
Conor

6

Nie pracuj dla mnie, musisz umieścić zakres w liczbie mnogiej

validates_uniqueness_of: teacher_id,: scope s => [: semester_id,: class_id]

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.