ArgumentError:索引名称...太长;限制为 62 个字符

win*_*yer 1 activerecord ruby-on-rails ruby-on-rails-5

我使用此命令创建了一个脚手架(Rails 5.2.1.1):

rails g scaffold EmailAddress value:string:index 
                              email_address_type:references 
                              email_addressable:references{polymorphic} 
                              position:integer
Run Code Online (Sandbox Code Playgroud)

这导致了这个迁移文件:

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
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会引发以下错误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
Run Code Online (Sandbox Code Playgroud)

我了解问题和错误。我想知道最好的解决方案是什么,因为索引不是add_index由某些背景魔法明确设置的。

kal*_*n93 5

正如 Wintermeyer 所说的是一种解决方案,还有另一种方法至少我觉得使用起来更顺畅。

 t.references :email_address_type, foreign_key: true, 
                                   index: { name: "addressable_index" }
Run Code Online (Sandbox Code Playgroud)

add_index通过这种方式,您不会在迁移中获得大量行。如果您进行大型迁移并且需要快速找到特定索引,这会有所帮助。这只是我个人的意见,Wintermeyer 解决方案也是一个可行的解决方案!