La réponse courte pour les anciennes versions de Rails (voir les autres réponses pour Rails 4+):
add_index :table_name, :column_name, unique: true
Pour indexer plusieurs colonnes ensemble, vous passez un tableau de noms de colonnes au lieu d'un seul nom de colonne,
add_index :table_name, [:column_name_a, :column_name_b], unique: true
Si vous obtenez "nom d'index ... est trop long", vous pouvez ajouter name: "whatever"
à la méthode add_index pour raccourcir le nom.
Pour un contrôle précis, il existe une execute
méthode " " qui exécute directement SQL.
C'est ça!
Si vous faites cela en remplacement des validations régulières des anciens modèles, vérifiez comment cela fonctionne. Le rapport d'erreur à l'utilisateur ne sera probablement pas aussi agréable sans validation au niveau du modèle. Vous pouvez toujours faire les deux.
indexed columns are not unique
erreur lorsque vous essayez de créer un index unique, cela peut être dû au fait que les données de la table contiennent déjà des doublons. Essayez de supprimer les données en double et de relancer la migration., :name => "whatever"
à laadd_index
méthode pour raccourcir le nom.ou
génère
Si vous ajoutez un index à une colonne existante, supprimez ou commentez la
add_column
ligne ou cochez la casela source
add_index...
et nonadd_column...
.Étant donné que cela n'a pas encore été mentionné mais répond à la question que je me posais lorsque j'ai trouvé cette page, vous pouvez également spécifier qu'un index doit être unique lorsque vous l'ajoutez via
t.references
out.belongs_to
:(à partir d'au moins Rails
4.2.7
)la source
Si vous créez un nouveau tableau, vous pouvez utiliser le raccourci en ligne:
la source
J'utilise Rails 5 et les réponses ci-dessus fonctionnent très bien; voici une autre façon qui a également fonctionné pour moi (le nom de la table est
:people
et le nom de la colonne est:email_address
)la source
Vous souhaiterez peut-être ajouter le nom de la clé unique car le nombre de fois que le nom unique_key par rails peut être trop long pour lequel la base de données peut renvoyer l'erreur.
Pour ajouter un nom à votre index, utilisez simplement l'
name:
option. La requête de migration pourrait ressembler à ceci -add_index :table_name, [:column_name_a, :column_name_b, ... :column_name_n], unique: true, name: 'my_custom_index_name'
Plus d'informations - http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index
la source
Pour indexer plusieurs colonnes ensemble, vous passez un tableau de noms de colonnes au lieu d'un seul nom de colonne.
la source
Si vous avez manqué d'ajouter unique à la colonne DB, ajoutez simplement cette validation dans le modèle pour vérifier si le champ est unique:
reportez-vous ici ci- dessus à des fins de test uniquement, veuillez ajouter un index en modifiant la colonne DB comme suggéré par @Nate
veuillez le consulter avec index pour plus d'informations
la source