validação do trilhos 3 por exclusividade em vários atributos

177

Eu uso o Rails 3.0.0.beta4

Desejo adicionar uma validação de exclusividade em dois atributos, o que significa que meu modelo é válido se for par 'recorded_at'e 'zipcode'for único.

Em um atributo aqui está a sintaxe

validates :zipcode, :uniqueness => true

obrigado

denisjacquemin
fonte

Respostas:

333

No Rails 2, eu teria escrito:

validates_uniqueness_of :zipcode, :scope => :recorded_at

No Rails 3:

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

Para vários atributos:

validates :zipcode, :uniqueness => {:scope => [:recorded_at, :something_else]}
Christian Lescuyer
fonte
7
Eu diria que, logicamente, faz mais sentido dizer que você precisa recorded_atser único no escopo de um CEP. validate :recorded_at, : uniqueness => { :scope => :zipcode }
Ariejan
2
você ainda pode fazê-lo da maneira trilhos 2, e acho isso mais legível, a menos que você esteja fazendo vários tipos de validação na mesma propriedade.
zem
24
você validaria um grupo de três com validates :zipcode, :uniqueness => {:scope => [:recorded_at, :something_else]}?
Greg Guida
5
Gostaria de acrescentar que, se você quiser usar :scopeem chaves estrangeiras, você precisa usar os :fkey_idsímbolos, em vez de :fkeyuns, mesmo se um "básico" :uniquenessfunciona em:fkey
nbarraille
1
Você provavelmente deseja adicionar um erro personalizado como msg, :message => ' is taken for this recorded date'
laffuste 15/05
96

Parâmetros de escopo múltiplo:

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

Isso deve responder à pergunta de Greg.

Raio
fonte
Greg parecia mais interessado em usar o 'valida' atalho, assim uma resposta mais rápida à sua pergunta é "sim"
elc
Isso é muito importante saber, eu estava procurando exatamente isso se eu deveria usar o _id (ou não) ao verificar associações em escopos.
Francesco Belladonna
Esta resposta funciona no Rails 4.1.6 validates_uniqueness_of: cart_id, scope: [: location_id,: plug_id]
Conor
6

Não trabalhe para mim, precisa colocar o escopo no plural

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

Jesus
fonte