14

Tengo un modelo que tiene dos campos, que llamaré first_name y last_name, y quiero asegurarme de que la combinación de los dos sea insensible a mayúsculas y minúsculas. He llegado a mitad de camino a través de este:Rails validates_uniqueness_of across multiple columns with case insensitivity

validates_uniqueness_of :first_name, :scope => :last_name 

El problema es que el control de la unicidad parece ser sensible a mayúsculas, a pesar de que the documentation dice que debe ser sensible a mayúsculas por defecto. Así que dado un registro existente:

{ :first_name => 'John', :last_name => 'Smith' } 

Esto se permitirá:

{ :first_name => 'JOHN', :last_name => 'SMITH' } 

así como cualquier registro adicional cuando hay alguna variación del caso, ya sea en el primer o el apellido. ¿Por qué se permiten estos registros? ¿Cómo puedo hacer cumplir la unicidad insensible a mayúsculas y minúsculas entre ambos campos?

Respuesta

21

¿Has probado validates_uniqueness_of :first_name, :scope => :last_name, :case_sensitive => false?

El documentation says es cierto por defecto.

(creo que el enlace que dio es que alguna documentación obsoleta. IIRC, el valor predeterminado para este cambio hizo en el último par de años.)

+0

tienes razón! La documentación que encontré me indujo a error. El ajuste ': case_sensitive => false' lo hizo funcionar para el first_name, pero no funciona en la otra dirección. Todavía aceptará '{: first_name => 'John',: last_name => 'SMITH'}'. ¿Hay alguna manera de hacerlo funcionar bidireccionalmente? ¿Incluiría simplemente dos reglas 'validates_uniqueness_of' con el campo intercambiado? –

+0

Intenté agregar otra validación con los dos campos intercambiados. Ahora se detectarán casos en los que uno de los campos está encapsulado de forma diferente, pero no si ambos son, por lo que esto se cumple: '{: first_name => 'JOHN',: last_name => 'SMITH'}'. –

+1

Solo escribiría un método de validación personalizado en este punto si fuera usted. –