rails 3 validation sur l'unicité sur plusieurs attributs

177

J'utilise Rails 3.0.0.beta4

Je souhaite ajouter une validation sur l'unicité sur deux attributs, cela signifie que mon modèle est valide si le couple de 'recorded_at'et 'zipcode'est unique.

Sur un attribut, voici la syntaxe

validates :zipcode, :uniqueness => true

Merci

denisjacquemin
la source

Réponses:

333

Dans Rails 2, j'aurais écrit:

validates_uniqueness_of :zipcode, :scope => :recorded_at

Dans Rails 3:

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

Pour plusieurs attributs:

validates :zipcode, :uniqueness => {:scope => [:recorded_at, :something_else]}
Christian Lescuyer
la source
7
Je dirais que logiquement, il est plus logique de dire que vous devez recorded_atêtre unique dans le cadre d'un code postal. validate :recorded_at, : uniqueness => { :scope => :zipcode }
Ariejan
2
vous pouvez toujours le faire de la manière des rails 2, et je trouve cela plus lisible à moins que vous ne fassiez plusieurs types de validation sur la même propriété.
zem
24
valideriez-vous un groupe de trois avec validates :zipcode, :uniqueness => {:scope => [:recorded_at, :something_else]}?
Greg Guida
5
J'ajouterais que si vous voulez utiliser :scopesur des clés étrangères, vous devez utiliser les :fkey_idsymboles, au lieu de :fkeyceux, même si un "basique" :uniquenessfonctionne sur:fkey
nbarraille
1
Vous souhaitez probablement ajouter un message d'erreur personnalisé comme, :message => ' is taken for this recorded date'
laffuste
96

Paramètres de portée multiples:

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

Cela devrait répondre à la question de Greg.

Rayon
la source
Greg semblait plus intéressé par l'utilisation du raccourci «valide», donc une réponse plus rapide à sa question est «oui»
elc
C'est assez important à savoir, je cherchais exactement à cela si je devais utiliser le _id (ou non) lors de la vérification des associations dans les portées.
Francesco Belladonna
Cette réponse fonctionne dans Rails 4.1.6 validates_uniqueness_of: cart_id, scope: [: location_id,: plug_id]
Conor
6

Ne fonctionne pas pour moi, besoin de mettre la portée au pluriel

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

Jésus
la source