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

How do I handle too long index names in a Ruby on Rails ActiveRecord migration?

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

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

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

Index name 'index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id' on table 'studies' is too long; the limit is 64 characters

我怎么处理这个? 我可以指定不同的索引名称吗?


add_index提供:name选项,例如:

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

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

1
t.references :long_name, index: { name: :my_index }


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

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


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

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

正常指数应该是:

1
:index_studies_on_professor_id_and_user_id

逻辑是:

  • index变为idx
  • 单数表名称
  • 没有加入的话
  • _id
  • 按字母顺序

通常这项工作。


你也可以

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

就像在Ruby on Rails API中一样。


与上一个答案类似:只需在常规add_index行中使用'name'键:

1
2
3
def change
  add_index :studies, :user_id, name: 'my_index'
end