ruby-on-rails - 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
通过一些背景魔法明确设置的。
解决方案
正如 Wintermeyer 所说的那样,这是一种解决方案,至少我发现还有另一种方法可以更顺畅地使用。
t.references :email_address_type, foreign_key: true,
index: { name: "addressable_index" }
通过这个,您不会在迁移中获得一堆add_index
行。如果您曾经进行过大规模迁移并且需要快速找到特定索引,这将很有帮助。这只是我个人的看法,Wintermeyer 解决方案也是一个可行的解决方案!
推荐阅读
- python - 合并具有匹配标题的行并合并它们的其他列
- php - 使用适用于 PHP 的 Google Drive API,将“keepRevisionForever”设置为 true 时上传文件的正确方法是什么?
- azure - 使用 Spring Cloud Stream 的 Azure 消息总线和批处理使用者
- reactjs - Redux combineReducers() 无法识别状态
- python - 'BertEmbeddings' 对象在转换 tf 检查点时没有属性'bias'
- azure - 我可以缓存令牌多长时间,Azure SDK 是否缓存令牌?
- php - 如何使用 API php 更新项目应用类型
- python - 列表索引越界(街机游戏)
- regex - grep 特定字符串并计算致命和错误的数量
- python - 如何通过索引为张量赋值?