Odpowiedzi:
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"
do add_index
metody, aby skrócić nazwę.
szyny generują migrację add_index_to_table_name nazwa_kolumny: uniq
lub
szyny generują migrację add_column_name_to_table_name nazwa_kolumny: string: uniq: index
generuje
class AddIndexToModerators < ActiveRecord::Migration
def change
add_column :moderators, :username, :string
add_index :moderators, :username, unique: true
end
end
Jeśli dodajesz indeks do istniejącej kolumny, usuń lub skomentuj add_column
linię lub zaznacz
add_column :moderators, :username, :string unless column_exists? :moderators, :username
add_index...
i nie add_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
lub t.belongs_to
:
create_table :accounts do |t|
t.references :user, index: { unique: true } # or t.belongs_to
# other columns...
end
(od co najmniej Rails 4.2.7
)
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
)
class AddIndexToEmailAddress < ActiveRecord::Migration[5.0]
def change
change_table :people do |t|
t.index :email_address, unique: true
end
end
end
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
Jeśli przegapiłeś dodanie unikatowego do kolumny DB, po prostu dodaj tę weryfikację w modelu, aby sprawdzić, czy pole jest unikalne:
class Person < ActiveRecord::Base
validates_uniqueness_of :user_name
end
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