Krótka odpowiedź dla starych wersji Railsów (zobacz inne odpowiedzi dla Railsów 4+):
add_index :table_name, :column_name, unique: true
Aby zindeksować wiele kolumn razem, przekazujesz tablicę nazw kolumn zamiast nazwy pojedynczej kolumny,
add_index :table_name, [:column_name_a, :column_name_b], unique: true
Jeśli pojawi się „nazwa indeksu ... jest za długa”, możesz dodać name: "whatever"
do metody add_index, aby skrócić nazwę.
Aby uzyskać precyzyjną kontrolę, istnieje execute
metoda, która wykonuje prosty SQL.
Otóż to!
Jeśli robisz to jako zamiennik regularnych sprawdzeń starego modelu, sprawdź, jak to działa. Zgłaszanie błędów do użytkownika prawdopodobnie nie będzie tak przyjemne bez sprawdzania poprawności na poziomie modelu. Zawsze możesz zrobić jedno i drugie.
indexed columns are not unique
podczas próby utworzenia unikalnego indeksu pojawi się błąd, przyczyną może być to, że dane w tabeli już zawierają duplikaty. Spróbuj usunąć zduplikowane dane i ponownie uruchom migrację., :name => "whatever"
doadd_index
metody, aby skrócić nazwę.lub
generuje
Jeśli dodajesz indeks do istniejącej kolumny, usuń lub skomentuj
add_column
linię lub zaznaczźródło
add_index...
i nieadd_column...
.Ponieważ nie zostało to jeszcze wspomniane, ale odpowiada na pytanie, które miałem, kiedy znalazłem tę stronę, możesz również określić, że indeks powinien być unikalny podczas dodawania go za pośrednictwem
t.references
lubt.belongs_to
:(od co najmniej Rails
4.2.7
)źródło
Jeśli tworzysz nową tabelę, możesz użyć wbudowanego skrótu:
źródło
Używam Rails 5 i powyższe odpowiedzi działają świetnie; oto inny sposób, który również działał dla mnie (nazwa tabeli to
:people
i nazwa kolumny to:email_address
)źródło
Możesz dodać nazwę unikalnego klucza tyle razy, ile razy domyślna nazwa unikalnego klucza przez szyny może być zbyt długa, przez co DB może wyrzucić błąd.
Aby dodać nazwę do indeksu, skorzystaj z
name:
opcji. Zapytanie migracyjne może wyglądać mniej więcej tak:add_index :table_name, [:column_name_a, :column_name_b, ... :column_name_n], unique: true, name: 'my_custom_index_name'
Więcej informacji - http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index
źródło
Aby zindeksować wiele kolumn razem, przekazujesz tablicę nazw kolumn zamiast nazwy pojedynczej kolumny.
źródło
Jeśli przegapiłeś dodanie unikatowego do kolumny DB, po prostu dodaj tę weryfikację w modelu, aby sprawdzić, czy pole jest unikalne:
patrz tutaj Powyżej służy wyłącznie do celów testowych, dodaj indeks , zmieniając kolumnę DB zgodnie z sugestią @Nate
więcej informacji można znaleźć w indeksie
źródło