Comment implémenter un index unique sur deux colonnes dans des rails

95

J'ai une table et j'essaye d'ajouter un index unique sur deux colonnes. Ces colonnes sont également indexées. Ma question est donc de savoir si je peux simplement supprimer les index qui n'étaient que pour une colonne ou si je dois utiliser les trois index:

add_index "subscriptions", ["user_id"]
add_index "subscriptions", ["content_id"]
add_index "subscriptions", ["user_id"], ["content_id"], :unique => true
Markus
la source
5
En remarque: si vous utilisez MySQL, cela n'a aucun sens d'avoir votre index used_idet content_iddans des index séparés si vous avez également un index unique des deux colonnes. Cela vaut probablement aussi pour d'autres DB ... Contrairement à ce que vous attendez, cela aura un impact négatif sur les performances (notamment les insertions / mises à jour).
hurikhan77

Réponses:

186
add_index :subscriptions, [:user_id, :content_id], unique: true
Shingara
la source
6
Il existe également des syntaxes alternatives: add_index: subscriptions, [: user_id,: content_id],: unique => true add_index: subscriptions,% w (user_id content_id),: unique => true C'est la même chose, juste une syntaxe différente pour spécifier les colonnes.
François Beausoleil
14
@ FrançoisBeausoleil %w(user_id content_id)en ruby ​​crée juste un tableau de cordes, ce n'est pas spécial pour les rails. Vous pouvez faire la même chose avec la "user_id content_id".splitcréation d'un tableau de chaînes. Je suis sûr que vous le savez, ce commentaire est juste pour que les autres lecteurs ne le rapportent pas correctement aux rails :)
Khaja Minhajuddin
Quelle serait la syntaxe pour cela lors de la création de table? <- réponse trouvée ( stackoverflow.com/questions/4870961/… )
tnaught
J'ai un problème étrange après avoir utilisé cela. Impossible d'exécuter une nouvelle migration à l'aide de rake db: migrate. Uniquement capable d'exécuter la migration en utilisant le numéro de version rake db: migrate: up VERSION = 20180411062714 un fichier à la fois. J'avais déjà des données sur la table sur lesquelles j'ai fait unique vrai sur deux colonnes.
thedudecodes
@ FrançoisBeausoleil Eh bien, en fait ce ne sont pas la même chose, %w(user_id content_id)c'est un tableau de cordes. Ce qui est le même que ['user_id', 'content_id']. La notation différente pour Array of Symbols est %i(user_id content_id), ou comme l'a écrit l'OP[:user_id, :content_id]
Sasa Blagojevic