Як реалізувати унікальний індекс на двох стовпцях у рейках


95

У мене є таблиця, і я намагаюся додати унікальний індекс у два стовпці. Ці стовпці також індексуються. Отже, моє питання полягає в тому, чи можу я просто видалити індекси, призначені лише для одного стовпця, чи мені потрібно використовувати всі три індекси:

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

Відповіді:


186
add_index :subscriptions, [:user_id, :content_id], unique: true

6
Існують також альтернативні синтаксиси: add_index: subscription, [: user_id,: content_id],: unique => true add_index: subscription,% w (user_id content_id),: unique => true Це одне і те ж, просто інший синтаксис для зазначення стовпців.
Франсуа Босолей

14
@ FrançoisBeausoleil %w(user_id content_id)у рубіні просто створює масив рядків, це не є особливим для рейок. Ви можете зробити те саме, за допомогою "user_id content_id".splitчого все ще створюється масив рядків. Я впевнений, ви це знаєте, цей коментар просто для того, щоб інші читачі не пов’язували це з рейками неправильно :)
Хаджа Мінхаджуддін,

Яким би був синтаксис цього для створення таблиці? <- знайшов відповідь ( stackoverflow.com/questions/4870961 / ... )
tnaught

У мене виникають дивні проблеми після використання цього. Не вдається запустити будь-яку нову міграцію за допомогою rake db: migrate. Запускати міграцію можна лише за допомогою номера версії rake db: migrate: up VERSION = 20180411062714 по одному файлу за раз. У мене вже були дані в таблиці, за якими я зробив унікальну істину за двома стовпцями.
thededecodes

@ FrançoisBeausoleil Ну, насправді це не одне і те ж, %w(user_id content_id)це масив рядків. Що те саме, що ['user_id', 'content_id']. Різні позначення масиву символів - %i(user_id content_id)або, як це писав ОП,[:user_id, :content_id]
Саша Благоєвич
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.