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

Author: Nakilon, 2009-03-27

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):

  1. El proceso A recibe una solicitud para crear un nuevo usuario con el nombre 'foo'
  2. El proceso B hace lo mismo
  3. 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.
  4. El proceso B hace lo mismo y obtiene la misma respuesta
  5. El proceso A envía la instrucción insert para el nuevo registro y tiene éxito
  6. 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.

De Ruby on Rails 3a Edición :

...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.

 213
Author: Jordan Brough,
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}
 67
Author: MaximusDominus,
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
 21
Author: vrish88,
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.

 1
Author: Victor S,
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