我用此命令创建了一个支架(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
显式设置的,而是由一些背景魔术设置的。
答案 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解决方案也是可行的解决方案!