Как реализовать уникальный индекс для двух столбцов в рельсах

96

У меня есть таблица, и я пытаюсь добавить уникальный индекс по двум столбцам. Эти столбцы также индексируются. Итак, мой вопрос в том, могу ли я просто удалить индексы, которые были только для одного столбца, или мне нужно использовать все три индекса:

add_index "subscriptions", ["user_id"]
add_index "subscriptions", ["content_id"]
add_index "subscriptions", ["user_id"], ["content_id"], :unique => true
Маркус
источник
5
В качестве примечания: если вы используете MySQL, нет смысла иметь свои индексы used_idи content_idв отдельных индексах, если у вас также есть уникальный индекс для обоих столбцов. Это, вероятно, также относится к другим БД ... Вопреки тому, что вы ожидаете, это окажет негативное влияние на производительность (особенно на вставки / обновления).
Hurikhan77 08

Ответы:

189
add_index :subscriptions, [:user_id, :content_id], unique: true
шингара
источник
6
Также существуют альтернативные синтаксисы: add_index: subscriptions, [: user_id,: content_id],: unique => true add_index: subscriptions,% w (user_id content_id),: unique => true Это одно и то же, только другой синтаксис для указания столбцов.
François Beausoleil
14
@ FrançoisBeausoleil %w(user_id content_id)в Ruby просто создает массив строк, это не относится к рельсам. Вы можете сделать то же самое, с "user_id content_id".splitкоторым все еще создается массив строк. Я уверен, что вы это знаете, этот комментарий просто для того, чтобы другие читатели не
связали
Каким будет синтаксис этого при создании таблицы? <- найден ответ ( stackoverflow.com/questions/4870961/… )
tnaught
После использования у меня возникла странная проблема. Невозможно запустить новую миграцию с помощью rake db: migrate. Можно выполнить миграцию только с использованием номера версии rake db: migrate: up VERSION = 20180411062714 по одному файлу за раз. У меня уже были данные в таблице, по которой я делал единственную истину по двум столбцам.
thedudecodes
1
@ FrançoisBeausoleil Ну, на самом деле это не одно и то же, %w(user_id content_id)это массив строк. То же, что и ['user_id', 'content_id']. Другая нотация для массива символов %i(user_id content_id), или, как написала ОП,[:user_id, :content_id]
Саса Благоевич