108 votes

Rails "validates_uniqueness_of" Sensibilité à la casse

Voici le modèle (j'utilise SQLLite3):

 class School < ActiveRecord::Base

  validates_uniqueness_of :name

end
 

Par exemple, après avoir ajouté "Yale", je ne peux pas ajouter "Yale" mais je peux ajouter "yale". Comment puis-je rendre la validation insensible à la casse?

EDIT: Found it - Validations d'enregistrement actives

239voto

Jordan Brough Points 2408

validates_uniqueness_of :name, :case_sensitive => false fait le tour, mais vous devez garder à l'esprit que, validates_uniqueness_of ne pas garantir l'unicité si vous avez plusieurs serveurs/serveur (par exemple, l'exécution de Phusion Passenger, plusieurs Chiens, etc) ou un serveur multithread. C'est parce que vous pourriez obtenir cette séquence d'événements (l'ordre est important):

  1. Processus reçoit une demande pour créer un nouvel utilisateur avec le nom "foo"
  2. Le processus B fait la même chose
  3. Processus Un valide le caractère unique de " foo " en demandant à la DB si ce nom existe encore et la DB dit que le nom n'existe pas encore.
  4. Le processus B fait la même chose et obtient la même réponse
  5. Le processus A présente à l' insert déclaration pour le nouvel enregistrement et réussit
  6. Si vous avez une contrainte de base de données nécessitant l'unicité de ce champ, le Processus B soumettra l' insert déclaration pour le nouvel enregistrement et échouer avec une moche exception de serveur qui vient de l'arrière de l'adaptateur SQL. Si vous n'avez pas de contrainte de base de données, l'insertion de succès et vous avez maintenant deux lignes avec " foo " que le nom.

Voir aussi "la Simultanéité et de l'intégrité" dans l' validates_uniqueness_of Rails de la documentation.

De Ruby on Rails 3ème Édition:

...en dépit de son nom, validates_uniqueness_of n'a pas vraiment garantir que les valeurs de la colonne sera unique. Tout ce qu'il peut faire est de vérifier qu'aucune colonne n'a la même valeur que dans le dossier en cours de validation au moment de la validation est effectuée. Il est possible que les deux enregistrements à être créé dans le même temps, chacun avec la même valeur pour une colonne qui doit être unique, et pour les deux enregistrements de validation. Le moyen le plus fiable pour renforcer l'unicité est une base de données-niveau de contrainte".

Voir aussi cette du programmeur d'expérience avec validates_uniqueness_of.

D'une façon c'est souvent le cas accidentel double-présentations à partir d'une page web lors de la création d'un nouveau compte. C'est un dur à résoudre, car ce que l'utilisateur sera de retour est le deuxième (laid) d'erreur et il va leur faire croire que leur inscription a échoué, alors qu'en réalité, il a réussi. Le meilleur moyen que j'ai trouvé pour éviter cela est d'utiliser javascript pour essayer d'éviter une double soumission.

91voto

MaximusDominus Points 407

Dans les rails 3, vous pouvez le faire dans votre modèle:

 validates :name, :uniqueness => true
 

ou sans case_sensibilité

 validates :name, :uniqueness => {:case_sensitive => false}
 

27voto

vrish88 Points 3918

Il y a une option où vous pouvez spécifier l'insensibilité à la casse

   validates_uniqueness_of :name, :case_sensitive => false
 

1voto

Victor S Points 1615

Il y a une question similaire mais la réponse est plus intéressante: http://stackoverflow.com/a/6422771

Fondamentalement, utiliser :case_sensitive => false effectue une requête de base de données très inefficace.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X