如何在Ruby on Rails ActiveRecord迁移中处理太长的索引名?

笑着哭i 提交于 2020-02-27 14:01:30

我试图添加从四个关联表的外键创建的唯一索引:

add_index :studies,
  ["user_id", "university_id", "subject_name_id", "subject_type_id"],
  :unique => true

数据库对索引名称的限制导致迁移失败。 这是错误消息:

表“研究”上的索引名称“ index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id”太长; 限制为64个字符

我该如何处理? 我可以指定其他索引名称吗?


#1楼

与上一个答案类似:只需在常规的add_index行中使用“名称”键:

def change
  add_index :studies, :user_id, name: 'my_index'
end

#2楼

你也可以

t.index([:branch_id, :party_id], unique: true, name: 'by_branch_party')

就像Ruby on Rails API中一样


#3楼

在PostgreSQL中, 默认限制是63个字符 。 因为索引名称必须唯一,所以有一些约定是很好的。 我使用(我调整了示例以解释更复杂的结构):

def change
  add_index :studies, [:professor_id, :user_id], name: :idx_study_professor_user
end

正常的索引应该是:

:index_studies_on_professor_id_and_user_id

逻辑将是:

  • index变成idx
  • 单一表格名称
  • 没有加入词
  • 没有_id
  • 按字母顺序

通常是哪个工作。


#4楼

您还可以在create_table块内的列定义中更改索引名称(例如,从迁移生成器获取)。

create_table :studies do |t|
  t.references :user, index: {:name => "index_my_shorter_name"}
end

#5楼

add_index提供:name选项,例如:

add_index :studies,
  ["user_id", "university_id", "subject_name_id", "subject_type_id"], 
  :unique => true,
  :name => 'my_index'

如果在create_table块中的references上使用:index选项,则它将与add_index相同的选项哈希作为其值:

t.references :long_name, index: { name: :my_index }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!