Próbuję dodać unikalny indeks, który jest tworzony z kluczy obcych czterech powiązanych tabel:
add_index :studies,
["user_id", "university_id", "subject_name_id", "subject_type_id"],
:unique => true
Ograniczenie bazy danych dla nazwy indeksu powoduje niepowodzenie migracji. Oto komunikat o błędzie:
Nazwa indeksu „index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id” w tabeli „studies” jest za długa; limit wynosi 64 znaki
Jak sobie z tym poradzić? Czy mogę podać inną nazwę indeksu?
remove_index :studies, :name => 'my_index'
dla każdego, kto jej potrzebuje4.2.6
współpracuje zindex: { name: :my_index }
. Tylkoname
nie działało.Możesz także zmienić nazwę indeksu w definicjach kolumn w ciągu
create_table
bloku (np. Z generatora migracji).źródło
create_table
t.references :searchable, polymorphic:true, index: {:name => "index_searches_on_searchable"}
W tym przypadku indeks był w rzeczywistości wielokolumnową (id_wyszukiwalny i typ_wyszukiwalny), a dodanie przestrzeni nazw do wygenerowanej nazwy stało się bardzo długie .foreign_key: true
a przy okazji, jest to świetne rozwiązanie, ponieważ jest najłatwiejsze w użyciu, gdy masz plik migracji utworzony wmodel:references
formacie generatora szynW PostgreSQL domyślny limit wynosi 63 znaków . Ponieważ nazwy indeksów muszą być unikalne, miło jest mieć trochę konwencji. Używam (poprawiłem przykład, aby wyjaśnić bardziej złożone konstrukcje):
Normalny wskaźnik byłby:
Logika wyglądałaby następująco:
index
staje sięidx
_id
Co zwykle wykonuje pracę.
źródło
Możesz też zrobić
jak w interfejsie API Ruby on Rails .
źródło
Podobna do poprzedniej odpowiedzi: po prostu użyj klawisza „name” ze zwykłą linią add_index:
źródło
Obawiam się, że żadne z tych rozwiązań nie działało dla mnie. Być może dlatego, że używałem
belongs_to
z mojej migracji create_table dla skojarzenia polimorficznego.Dodam mój kod poniżej i link do rozwiązania, które pomogło mi na wypadek, gdyby ktoś natknął się na hasło „Nazwa indeksu jest za długa” w związku z powiązaniami polimorficznymi.
Poniższy kod NIE działał dla mnie:
Ten kod DID działał dla mnie:
Oto SO pytania i odpowiedzi, które pomogły mi: https://stackoverflow.com/a/30366460/3258059
źródło
Miałem ten problem, ale z
timestamps
funkcją. Automatycznie generował indeks w updated_at, który przekroczył limit 63 znaków:Próbowałem użyć
timestamps
do określenia nazwy indeksu:Próbuje to jednak zastosować nazwę indeksu do pól
updated_at
icreated_at
:W końcu zrezygnowałem
timestamps
i po prostu stworzyłem znaczniki czasu:To działa, ale chciałbym usłyszeć, czy jest to możliwe dzięki tej
timestamps
metodzie!źródło
create_table: you_table_name do | t | t.references: studant, index: {name: 'name_for_studant_index'} t.references: nauczyciel, index: {name: 'name_for_teacher_index'} koniec
źródło
Mam projekt, który często korzysta z generatorów i potrzebuję go do automatycznego, więc skopiowałem
index_name
funkcję ze źródła szyn, aby ją zastąpić. Dodałem to wconfig/initializers/generated_index_name.rb
:Tworzy indeksy takie jak
ix_assignments_on_case_id__project_id
i po prostu obcina go do 63 znaków, jeśli nadal jest zbyt długi. To nadal nie będzie unikalne, jeśli nazwa tabeli jest bardzo długa, ale możesz dodać komplikacje, takie jak skrócenie nazwy tabeli osobno od nazw kolumn lub faktycznie sprawdzenie wyjątkowości.Uwaga: pochodzi z projektu Rails 5.2; jeśli zdecydujesz się to zrobić, skopiuj źródło ze swojej wersji.
źródło