Estou tentando adicionar um índice exclusivo que é criado a partir das chaves estrangeiras de quatro tabelas associadas:
add_index :studies,
["user_id", "university_id", "subject_name_id", "subject_type_id"],
:unique => true
A limitação do banco de dados para o nome do índice causa falha na migração. Aqui está a mensagem de erro:
O nome do índice 'index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id' na tabela 'estudos' é muito longo; o limite é de 64 caracteres
Como posso lidar com isso? Posso especificar um nome de índice diferente?
remove_index :studies, :name => 'my_index'
para quem precisa dele4.2.6
trabalha comindex: { name: :my_index }
. Sóname
não funcionou.Você também pode alterar o nome do índice nas definições de coluna em um
create_table
bloco (como o obtido no gerador de migração).fonte
create_table
t.references :searchable, polymorphic:true, index: {:name => "index_searches_on_searchable"}
Nesse caso, o índice era de fato uma coluna múltipla (searchable_id e searchable_type) e a adição do espaço para nome no nome gerado se tornou muito longa .foreign_key: true
e pela maneira, esta é uma grande solução, já que é o mais fácil de usar quando você tem um arquivo de migração criado com os trilhos gerador demodel:references
formatoNo PostgreSQL, o limite padrão é de 63 caracteres . Como os nomes dos índices devem ser exclusivos, é bom ter uma pequena convenção. Eu uso (ajustei o exemplo para explicar construções mais complexas):
O índice normal teria sido:
A lógica seria:
index
torna-seidx
_id
O que geralmente faz o trabalho.
fonte
Você também pode fazer
como na API Ruby on Rails .
fonte
Semelhante à resposta anterior: basta usar a tecla 'name' com sua linha add_index normal:
fonte
Receio que nenhuma dessas soluções funcionou para mim. Talvez porque eu estivesse usando
belongs_to
na minha migração create_table para uma associação polimórfica.Vou adicionar meu código abaixo e um link para a solução que me ajudou, caso mais alguém se depara ao pesquisar por 'O nome do índice é muito longo' em conexão com associações polimórficas.
O código a seguir NÃO funcionou para mim:
Este código funcionou para mim:
Este é o SO Q&A que me ajudou: https://stackoverflow.com/a/30366460/3258059
fonte
Eu tive esse problema, mas com a
timestamps
função. Gerava automaticamente um índice em updated_at que excedia o limite de 63 caracteres:Eu tentei usar
timestamps
para especificar o nome do índice:No entanto, isso tenta aplicar o nome do índice aos campos
updated_at
ecreated_at
:Por fim, desisti
timestamps
e apenas criei os carimbos de data e hora:Isso funciona, mas eu adoraria saber se é possível com o
timestamps
método!fonte
create_table: you_table_name do | t | t.references: aluno, índice: {name: 'name_for_studant_index'} t.references: professor, índice: {name: 'name_for_teacher_index'} end
fonte
Eu tenho um projeto que usa muito geradores e precisava que isso fosse automático, então copiei o
index_name
função da fonte de trilhos para substituí-la. Eu adicionei isso emconfig/initializers/generated_index_name.rb
:Cria índices como
ix_assignments_on_case_id__project_id
e apenas o trunca para 63 caracteres, se ainda for muito longo. Isso ainda não será exclusivo se o nome da tabela for muito longo, mas você pode adicionar complicações como encurtar o nome da tabela separadamente dos nomes das colunas ou verificar a exclusividade.Observe que isso é de um projeto do Rails 5.2; se você decidir fazer isso, copie a fonte da sua versão.
fonte