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.