Rails "valida la unicidad de" Sensibilidad de mayúsculas y minúsculas
Aquí está el modelo (estoy usando SQLLite3):
class School < ActiveRecord::Base
validates_uniqueness_of :name
end
Por ejemplo, después de agregar "Yale", no puedo agregar "Yale" pero puede agregar "yale."¿Cómo puedo hacer que la validación sea insensible a mayúsculas y minúsculas?
EDITAR: Encontrado - Validaciones de Registro activo
4 answers
validates_uniqueness_of :name, :case_sensitive => false
hace el truco, pero debe tener en cuenta que validates_uniqueness_of
hace no garantiza la unicidad si tiene varios servidores/procesos de servidor (por ejemplo, ejecutando Phusion Passenger, varios Mestizos, etc.) o un servidor multiproceso. Esto se debe a que usted podría obtener esta secuencia de eventos (el orden es importante):
- El proceso A recibe una solicitud para crear un nuevo usuario con el nombre 'foo'
- El proceso B hace lo mismo
- El proceso A valida la unicidad de 'foo' preguntando a la base de datos si ese nombre existe todavía y la base de datos dice que el nombre no existe todavía.
- El proceso B hace lo mismo y obtiene la misma respuesta
- El proceso A envía la instrucción
insert
para el nuevo registro y tiene éxito - Si tiene una restricción de base de datos que requiere unicidad para ese campo, el Proceso B enviará la instrucción
insert
para el nuevo registro y fallará con una desagradable excepción de servidor que regresa del adaptador SQL. Si no tiene una restricción de base de datos, la inserción tendrá éxito y ahora tiene dos filas con 'foo' como nombre.
Véase también "Concurrencia e integridad" en el validates_uniqueness_of
Documentación de Rails.
...a pesar de su nombre, validates_uniqueness_of no garantiza realmente que los valores de columna sean únicos. Todo lo que puede hacer es verificar que ninguna columna tenga el mismo valor que la del registro que se está validando en el momento de la validación se realiza. Es posible que se creen dos registros al mismo tiempo, cada uno con el mismo valor para una columna que debe ser única, y que ambos registros pasen la validación. La forma más confiable de hacer cumplir la singularidad es con una restricción a nivel de base de datos."
Ver también la experiencia de este programador con validates_uniqueness_of
.
Una forma en que esto sucede comúnmente es el doble envío accidental de una página web al crear una nueva cuenta. Esto es difícil de resolver porque lo que el usuario recuperará es el segundo error (feo) y les hará pensar que su registro falló, cuando en realidad tuvo éxito. La mejor manera que he encontrado para evitar esto es usar javascript para tratar de evitar el doble envío.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-06 16:59:05
En rails 3 puedes hacer esto en tu modelo:
validates :name, :uniqueness => true
O sin case_sensitivity
validates :name, :uniqueness => {:case_sensitive => false}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-14 20:27:44
Hay una opción donde se puede especificar la insensibilidad a mayúsculas y minúsculas
validates_uniqueness_of :name, :case_sensitive => false
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-27 17:24:28
Hay una pregunta similar, pero la respuesta es más interesante: https://stackoverflow.com/a/6422771
Básicamente, usando :case_sensitive => false
realiza una consulta de base de datos muy ineficiente.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:13