40

en Rails 2.x puede utilizar validaciones para asegurarse de que tiene un valor único combinado de esta manera:Rails 3: Validar valores combinados

validates_uniqueness_of :husband, :scope => :wife 

En la migración correspondiente que podría tener este aspecto:

add_index :family, [:husband, :wife], :unique => true 

Esto aseguraría que la combinación marido/mujer sea única en la base de datos. Ahora, en Rails 3, la sintaxis de validación cambió y el atributo del alcance parece haber desaparecido. Ahora parece que:

validates :husband, :presence => true 

¿Alguna idea de cómo puedo lograr la validación combinada en Rails 3? Las validaciones de Rails 2.x aún funcionan en Rails 3, así que aún puedo usar el primer ejemplo, pero parece tan "viejo", ¿hay formas mejores?

Respuesta

57

Tener conmigo. La forma en que funciona el método validates en ActiveModel es buscar un Validator.

:presence => true busca PresenceValidator y pasa las opciones: true al inicializador del validador.

Creo que quieres

validates :husband, :presence => true, :uniqueness => {:scope => :wife} 

(El validador singularidad es en realidad parte de ActiveRecord, no ActiveModel. Es muy interesante cómo los desarrolladores configurar esto. Es muy elegante.)

+1

Me acaba de confirmar esta funciona en mi propia aplicación – epochwolf

+0

Esto suena increíble y limpio y todo ... pero no funciona en mi muestra 'un proyecto modelo' lo intenté. ¿Hicieron algo especial? Usé 2 cadenas y también intenté con 2 enteros, pero las validaciones simplemente pasan. – Cimm

+0

Estoy usando 'validates: contents,: presence => true,: uniqueness => {: scope =>: comment_thread_id,: message =>" ya se ha dicho, por favor agregue algo significativo "}' – epochwolf