ArgumentError: Имя индекса ... слишком длинное;ограничение составляет 62 символа - PullRequest
0 голосов
/ 10 декабря 2018

Я создал скаффолд с помощью этой команды (Rails 5.2.1.1):

rails g scaffold EmailAddress value:string:index 
                              email_address_type:references 
                              email_addressable:references{polymorphic} 
                              position:integer

, что привело к созданию этого файла миграции:

class CreateEmailAddresses < ActiveRecord::Migration[5.2]
  def change
    create_table :email_addresses do |t|
      t.string :value
      t.references :email_address_type, foreign_key: true
      t.references :email_addressable, polymorphic: true
      t.integer :position

      t.timestamps
    end
    add_index :email_addresses, :value
  end
end

К сожалению, возникает следующая ошибка rails db:migrate:

Caused by:
ArgumentError: Index name
'index_email_addresses_on_email_addressable_type_and_email_addressa...' 
on table 'email_addresses' is too long; the limit is 62 characters

Я понимаю проблему и ошибку.Мне интересно, каково лучшее решение, потому что индекс устанавливается не просто с помощью add_index, а с помощью некоторой фоновой магии.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Как говорит Винтермейер, это одно из решений, но есть и другой способ, по крайней мере, найти более плавный в использовании.

 t.references :email_address_type, foreign_key: true, 
                                   index: { name: "addressable_index" }

Благодаря этому вы не получите кучу add_index строк в своей миграции.Это помогает, если у вас когда-либо большая миграция и вам нужно быстро найти определенный индекс.Это мое личное мнение, решение от Wintermeyer также исправлено!

0 голосов
/ 10 декабря 2018

index: false является решением этой проблемы.Далее следует add_index внизу.Вот миграция:

class CreateEmailAddresses < ActiveRecord::Migration[5.2]
  def change
    create_table :email_addresses do |t|
      t.string :value
      t.references :email_address_type, foreign_key: true
      t.references :email_addressable, polymorphic: true, index: false
      t.integer :position

      t.timestamps
    end
    add_index :email_addresses, :value
    add_index :email_addresses, [:email_addressable_type, 
                                :email_addressable_id], 
                                name: 'email_addressable_index'
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...