Comment définir un “unique” de la contrainte sur une colonne de la table MySQL Ruby on Rails 3?
J'ai une simple table MySQL avec une colonne: name
.
Je voudrais définir une contrainte unique sur cette colonne.
Je peux le faire:
class MyModel < ActiveRecord::Base
validates_uniqueness_of :my_column_name
end
mais il faudra travailler uniquement au niveau de l'application, pas au niveau base de données.
Que suggérez-vous ?
OriginalL'auteur Misha Moroshko | 2010-12-10
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas super utile, mais il semble comme il n'est pas une grande réponse pour appliquer l'unicité au niveau base de données. À partir de la Rails de guide de migration:
Il ressemble à l'exécution de la commande SQL-vous avec le ActiveRecord méthode execute peut-être la meilleure voie à suivre si vous voulez vraiment faire respecter l'unicité dans la base de données.
OriginalL'auteur jergason
Ajouter une contrainte unique à la base de données elle-même à l'aide de:
...par le biais d'une migration (et vous voudrez peut-être faire que my_column_name accepte pas les valeurs null:
add_index :my_models, [:my_column_name1, :my_column_name2], unique: true
Comment pouvez-vous tester? Aussi loin que les Rails sont concernés, pas encore de modèle enregistré qui contrevient à cette contrainte est encore un modèle valide parce qu'il passe du modèle de couche d'application des contraintes. C'est un peu salissant à essayer de l'enregistrer, puis de regarder pour un RecordNotUnique d'erreur de la base de données.
drewww: Cela est généralement utile dans les situations où vous avez une méthode de fabrique de la création de modèles et de plusieurs threads d'exécution, où l'application de la couche de contraintes peuvent être trompés par le fait que l'enregistrement des validations peuvent compter sur la présence d'autres dossiers (exemple: les noms d'utilisateur unique)
c'est en fait pour les Rails 4. Question t de l'état de Rails 3, mais ce qui m'a aidé 🙂
Grâce sircapsalot. Autant que je sache, cette syntaxe est la même depuis des Rails 1.1.1 (apidock.com/rails/v1.1.1/ActiveRecord/ConnectionAdapters/...). Si vous faites allusion à l'unique: true vs :unique => true, Qui est en fait un Rubis changement dans Ruby 1.9.
OriginalL'auteur Eric Wanchic