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

时间:2018-12-10 08:17:37

标签: ruby-on-rails activerecord 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

生成了此迁移文件:

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 :(得分:1)

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

答案 1 :(得分:1)

正如温特迈尔所说,这是一种解决方案,至少我发现还有另一种使用方式更平滑。

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

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