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

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

数据库对索引名的限制导致迁移失败。下面是错误信息:

索引名' index_studes_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id '表'studies'太长;限制为64个字符

我该怎么处理呢?我可以指定不同的索引名吗?


当前回答

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

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

如果对create_table块中的引用使用:index选项,则它的值与add_index相同:

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

其他回答

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

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

如果对create_table块中的引用使用:index选项,则它的值与add_index相同:

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

类似于前面的答案:只需在常规add_index行中使用'name'键:

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

恐怕这些方法对我都不起作用。也许是因为我在create_table迁移中使用belongs_to进行多态关联。

我将在下面添加我的代码和解决方案的链接,以防其他人在搜索与多态关联有关的“索引名称太长”时偶然发现它。

下面的代码没有为我工作:

def change
  create_table :item_references do |t|
    t.text :item_unique_id
    t.belongs_to :referenceable, polymorphic: true
    t.timestamps
  end
  add_index :item_references, [:referenceable_id, :referenceable_type], name: 'idx_item_refs'
end

这段代码确实为我工作:

def change
  create_table :item_references do |t|
    t.text :item_unique_id
    t.belongs_to :referenceable, polymorphic: true, index: { name: 'idx_item_refs' }

    t.timestamps
  end
end

这是帮助我的SO问答:https://stackoverflow.com/a/30366460/3258059

你也可以

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

就像Ruby on Rails API一样。

Create_table:you_table_name do |t| .使用实例 T.references: student, index: {name: 'name_for_studant_index'} T.references:teacher, index: {name: 'name_for_teacher_index'} 结束