首页 > 解决方案 > ArgumentError: Index name ... is too long; 限制为 62 个字符

问题描述

我用这个命令创建了一个脚手架(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通过一些背景魔法明确设置的。

标签: ruby-on-railsactiverecordruby-on-rails-5

解决方案


正如 Wintermeyer 所说的那样,这是一种解决方案,至少我发现还有另一种方法可以更顺畅地使用。

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

通过这个,您不会在迁移中获得一堆add_index行。如果您曾经进行过大规模迁移并且需要快速找到特定索引,这将很有帮助。这只是我个人的看法,Wintermeyer 解决方案也是一个可行的解决方案!


推荐阅读