validación de rails 3 sobre unicidad en múltiples atributos

177

Yo uso Rails 3.0.0.beta4

Quiero agregar una validación de unicidad en dos atributos, eso significa que mi modelo es válido si el par de 'recorded_at'y 'zipcode'es único.

En un atributo aquí está la sintaxis

validates :zipcode, :uniqueness => true

Gracias

denisjacquemin
fuente

Respuestas:

333

En Rails 2, habría escrito:

validates_uniqueness_of :zipcode, :scope => :recorded_at

En Rails 3:

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

Para múltiples atributos:

validates :zipcode, :uniqueness => {:scope => [:recorded_at, :something_else]}
Christian Lescuyer
fuente
77
Diría que, lógicamente, tiene más sentido decir que es necesario recorded_atser único dentro del alcance de un código postal. validate :recorded_at, : uniqueness => { :scope => :zipcode }
Ariejan
2
todavía puede hacerlo en los rieles de 2 vías, y me parece más legible a menos que esté haciendo varios tipos de validación en la misma propiedad.
zem
24
¿Validarías un grupo de tres con validates :zipcode, :uniqueness => {:scope => [:recorded_at, :something_else]}?
Greg Guida
55
Agregaría que si desea usar :scopeen claves foráneas, debe usar los :fkey_idsímbolos, en lugar de :fkeyunos, incluso si un "básico" :uniquenessfunciona:fkey
nbarraille
1
Probablemente desee agregar un , :message => ' is taken for this recorded date'
mensaje de
96

Parámetros de alcance múltiple:

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

Esto debería responder la pregunta de Greg.

Rayo
fuente
Greg parecía más interesado en usar el acceso directo "valida", por lo que una respuesta más rápida a su pregunta es "sí"
elc
Es muy importante saber esto, estaba buscando exactamente esto si debería usar el _id (o no) al buscar asociaciones en ámbitos.
Francesco Belladonna
Esta respuesta funciona en Rails 4.1.6 validates_uniqueness_of: cart_id, scope: [: location_id,: plug_id]
Conor
6

No funciona para mí, necesito poner el alcance en plural

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

Jesús
fuente