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):
- Processus reçoit une demande pour créer un nouvel utilisateur avec le nom "foo"
- Le processus B fait la même chose
- 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.
- Le processus B fait la même chose et obtient la même réponse
- Le processus A présente à l'
insert
déclaration pour le nouvel enregistrement et réussit
- 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.