ruby-on-rails - 在ActiveRecord迁移中,如何处理索引名称太长?

81 2

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


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

我该如何处理这个问题? 是否可以指定其他索引名称?

时间: 原作者:

87 5

:name选项提供给add_index,例如:


add_index :studies,


 [\"user_id\",\"university_id\",\"subject_name_id\",\"subject_type_id\"], 


 :unique => true,


 :name => \'my_index\'



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


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



原作者:
74 4

还可以在create_table块(就像你从migration generator )中的列定义中更改索引名称。


create_table :studies do |t|


 t.references :user, index: {:name =>\"index_my_shorter_name\"}


end



原作者:
54 4

我使用(我调整了这个例子来解释更复杂的结构):


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
  • Singular table name
  • 无连接词
  • _id
  • 字母顺序

通常是这样做的。

原作者:
128 0

你也可以做


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



就像Ruby on Rails API 。

原作者:
147 4

只需在常规添加索引行中使用name键


def change


 add_index :studies, :user_id, name: \'my_index\'


end



原作者:
...