Cómo implementar un índice único en dos columnas en rieles

95

Tengo una tabla y estoy tratando de agregar un índice único en dos columnas. Estas columnas también están indexadas. Entonces, mi pregunta es si puedo eliminar los índices que eran solo para una columna o si tengo que usar los tres índices:

add_index "subscriptions", ["user_id"]
add_index "subscriptions", ["content_id"]
add_index "subscriptions", ["user_id"], ["content_id"], :unique => true
Markus
fuente
5
Como nota al margen: si está utilizando MySQL, no tiene sentido tener su índice used_idy content_iden índices separados si también tiene un índice único de ambas columnas. Esto probablemente también se aplica a otras bases de datos ... Al contrario de lo que espera, tendrá un impacto negativo en el rendimiento (especialmente inserciones / actualizaciones).
hurikhan77

Respuestas:

186
add_index :subscriptions, [:user_id, :content_id], unique: true
shingara
fuente
6
También hay sintaxis alternativas: add_index: subscriptions, [: user_id,: content_id],: unique => true add_index: subscriptions,% w (user_id content_id),: unique => true Son lo mismo, solo que sintaxis diferente para especificar las columnas.
François Beausoleil
14
@ FrançoisBeausoleil %w(user_id content_id)en ruby ​​solo crea una matriz de cadenas, no es especial para los rieles. Puede hacer lo mismo con el "user_id content_id".splitque todavía está creando una matriz de cadenas. Estoy seguro de que lo sabes, este comentario es solo para que otros lectores no relacionen esto con los rieles incorrectamente :)
Khaja Minhajuddin
¿Cuál sería la sintaxis para esto en la creación de tablas? <- respuesta encontrada ( stackoverflow.com/questions/4870961/… )
tnaught
Tengo un problema extraño después de usar esto. No se puede ejecutar ninguna nueva migración con rake db: migrate. Solo se puede ejecutar la migración con el número de versión rake db: migrate: up VERSION = 20180411062714 un archivo a la vez. Ya tenía datos en la tabla en los que hice una verdad única en dos columnas.
thedudecodes
@ FrançoisBeausoleil Bueno, en realidad no son lo mismo, %w(user_id content_id)es un Array of Strings. Que es lo mismo que ['user_id', 'content_id']. La notación diferente para Array of Symbols es %i(user_id content_id), o como lo escribió el OP[:user_id, :content_id]
Sasa Blagojevic