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

denisjacquemin
źródło

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]}
Christian Lescuyer
źródło
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.

Promień
źródło
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]

Jezus
źródło