Como implementar um índice único em duas colunas em trilhos

94

Eu tenho uma tabela e estou tentando adicionar um índice exclusivo em duas colunas. Essas colunas também são indexadas. Então, minha pergunta é se eu posso remover os índices que eram apenas para uma coluna ou se eu tenho que usar todos os três índices:

add_index "subscriptions", ["user_id"]
add_index "subscriptions", ["content_id"]
add_index "subscriptions", ["user_id"], ["content_id"], :unique => true
Markus
fonte
5
Como uma observação lateral: se você estiver usando o MySQL, não faz sentido ter seus índices used_ide content_idem separados se você também tiver um índice exclusivo de ambas as colunas. Isso provavelmente também se aplica a outros bancos de dados ... Ao contrário do que você espera, terá um impacto negativo no desempenho (especialmente inserções / atualizações).
hurikhan77

Respostas:

185
add_index :subscriptions, [:user_id, :content_id], unique: true
Shingara
fonte
6
Existem também sintaxes alternativas: add_index: subscriptions, [: user_id,: content_id],: unique => true add_index: subscriptions,% w (user_id content_id),: unique => true Eles são a mesma coisa, apenas sintaxe diferente para especificar as colunas.
François Beausoleil
14
@ FrançoisBeausoleil %w(user_id content_id)em rubi apenas cria uma série de cordas, não é especial para trilhos. Você pode fazer o mesmo com o "user_id content_id".splitqual ainda está criando uma matriz de strings. Tenho certeza que você sabe disso, este comentário é apenas para que outros leitores não relacionem isso com trilhos incorretamente :)
Khaja Minhajuddin
Qual seria a sintaxe para isso na criação da tabela? <- resposta encontrada ( stackoverflow.com/questions/4870961/… )
tnaught
Estou tendo um problema estranho depois de usar isso. Não é possível executar nenhuma nova migração usando rake db: migrate. Só é possível executar a migração usando o número de versão rake db: migrate: up VERSION = 20180411062714 um arquivo por vez. Já tinha dados na tabela em que fiz true exclusivo em duas colunas.
thedudecodes
@ FrançoisBeausoleil Bem, na verdade eles não são a mesma coisa, %w(user_id content_id)é um Array of Strings. Qual é o mesmo que ['user_id', 'content_id']. A notação diferente para Array of Symbols é %i(user_id content_id), ou como o OP escreveu[:user_id, :content_id]
Sasa Blagojevic