Я пытаюсь добавить уникальный индекс, который создается из внешних ключей четырех связанных таблиц:
add_index :studies,
["user_id", "university_id", "subject_name_id", "subject_type_id"],
:unique => true
Ограничение базы данных на имя индекса приводит к сбою миграции. Вот сообщение об ошибке:
Имя индекса 'index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id' в таблице 'Studies' слишком длинное; ограничение составляет 64 символа
Как я могу справиться с этим? Могу ли я указать другое имя индекса?
remove_index :studies, :name => 'my_index'
для всех, кому это нужно4.2.6
работает сindex: { name: :my_index }
. Толькоname
не сработало.Вы также можете изменить имя индекса в определениях столбцов в
create_table
блоке (например, из генератора миграции).источник
create_table
t.references :searchable, polymorphic:true, index: {:name => "index_searches_on_searchable"}
в этом случае индекс был на самом деле многостолбцовым (searchable_id и searchable_type), и добавление пространства имен в сгенерированное имя стало очень длинным ,foreign_key: true
и, кстати, это отличное решение, поскольку его проще всего использовать, когда у вас есть файл миграции, созданный вmodel:references
формате генератора рельсовВ PostgreSQL ограничение по умолчанию составляет 63 символа . Поскольку имена индексов должны быть уникальными, хорошо иметь небольшое соглашение. Я использую (я подправил пример, чтобы объяснить более сложные конструкции):
Нормальный индекс был бы:
Логика будет такой:
index
становитсяidx
_id
Который обычно делает работу.
источник
Вы также можете сделать
как в Ruby on Rails API .
источник
Аналогично предыдущему ответу: просто используйте клавишу «name» с вашей обычной строкой add_index:
источник
Боюсь, ни одно из этих решений не сработало для меня. Возможно, потому что я использовал
belongs_to
в своей миграции create_table полиморфную ассоциацию.Я добавлю свой код ниже и ссылку на решение, которое помогло мне в случае, если кто-то еще наткнется при поиске «Имя индекса слишком длинное» в связи с полиморфными ассоциациями.
Следующий код не работает для меня:
Этот код работал для меня:
Это SO Q & A, которая помогла мне: https://stackoverflow.com/a/30366460/3258059
источник
У меня была эта проблема, но с
timestamps
функцией. Он автоматически генерировал индекс на updated_at, который превысил ограничение в 63 символа:Я пытался использовать
timestamps
для указания имени индекса:Тем не менее, это пытается применить имя индекса для обоих
updated_at
иcreated_at
полей:Наконец, я сдался
timestamps
и просто создал метки времени для долгого пути:Это работает, но я хотел бы услышать, если это возможно с
timestamps
методом!источник
create_table: you_table_name do | t | t.references: ученик, индекс: {имя: 'name_for_studant_index'} t.references: учитель, индекс: {name: 'name_for_teacher_index'} конец
источник
У меня есть проект, который часто использует генераторы, и мне нужно, чтобы это было автоматически, поэтому я скопировал
index_name
функцию из источника rails, чтобы переопределить ее. Я добавил это вconfig/initializers/generated_index_name.rb
:Это создает индексы как
ix_assignments_on_case_id__project_id
и просто усекает его до 63 символов, если он все еще слишком длинный. Это по-прежнему будет неуникальным, если имя таблицы очень длинное, но вы можете добавить такие сложности, как сокращение имени таблицы отдельно от имен столбцов или фактическая проверка на уникальность.Обратите внимание, это из проекта Rails 5.2; если вы решите сделать это, скопируйте исходный код из вашей версии.
источник