rails 3 валидация уникальности по нескольким атрибутам

177

Я использую Rails 3.0.0.beta4

Я хочу добавить проверку уникальности по двум атрибутам, это означает, что моя модель действительна, если пара 'recorded_at'и 'zipcode'уникальна.

На одном атрибуте здесь есть синтаксис

validates :zipcode, :uniqueness => true

Спасибо

denisjacquemin
источник

Ответы:

333

В Rails 2 я бы написал:

validates_uniqueness_of :zipcode, :scope => :recorded_at

В Rails 3:

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

Для нескольких атрибутов:

validates :zipcode, :uniqueness => {:scope => [:recorded_at, :something_else]}
Кристиан Лескуйер
источник
7
Я бы сказал, что логически логичнее сказать, что вам нужно recorded_atбыть уникальным в пределах почтового индекса. validate :recorded_at, : uniqueness => { :scope => :zipcode }
Ariejan
2
вы все равно можете сделать это с помощью rails 2 way, и я нахожу это более читабельным, если вы не проводите несколько типов проверки на одном и том же свойстве.
Зем
24
Вы бы подтвердили группу из трех человек validates :zipcode, :uniqueness => {:scope => [:recorded_at, :something_else]}?
Грег Гида
5
Я бы добавил, что если вы хотите использовать :scopeвнешние ключи, вам нужно использовать :fkey_idсимволы вместо :fkeyних, даже если «базовый» :uniquenessработает:fkey
nbarraille
1
Вы, вероятно, хотите добавить пользовательскую ошибку, например,, :message => ' is taken for this recorded date'
laffuste
96

Параметры нескольких областей:

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

Это должно ответить на вопрос Грега.

луч
источник
Грег, похоже, больше заинтересован в использовании ярлыка «validates», поэтому более быстрый ответ на его вопрос «да»
elc
Это очень важно знать, я искал именно это, должен ли я использовать _id (или нет) при проверке ассоциаций в областях.
Франческо Белладонна
Этот ответ работает в Rails 4.1.6 validates_uniqueness_of: cart_id, scope: [: location_id,: plug_id]
Conor
6

Не работать для меня, нужно поставить область во множественном числе

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

Иисус
источник