首页 文章

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

提问于
浏览
314

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

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个字符

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

5 回答

  • 469

    在PostgreSQL中,the default limit is 63 characters . 因为索引名称必须是唯一的,所以有一点约定是很好的 . 我使用(我调整了示例来解释更复杂的结构):

    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

    • 按字母顺序排列

    通常这项工作 .

  • 148

    你也可以这样做

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

    Ruby on Rails API .

  • 27

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

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

    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 }
    
  • 5

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

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

相关问题