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

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]}

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.


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]

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.