我试图添加一个独特的索引,从四个相关表的外键创建:
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个字符
我该怎么处理呢?我可以指定不同的索引名吗?
我有一个经常使用生成器的项目,需要它是自动的,所以我从rails源代码复制index_name函数来覆盖它。我在config/initializers/generated_index_name.rb中添加了这个:
# make indexes shorter for postgres
require "active_record/connection_adapters/abstract/schema_statements"
module ActiveRecord
module ConnectionAdapters # :nodoc:
module SchemaStatements
def index_name(table_name, options) #:nodoc:
if Hash === options
if options[:column]
"ix_#{table_name}_on_#{Array(options[:column]) * '__'}".slice(0,63)
elsif options[:name]
options[:name]
else
raise ArgumentError, "You must specify the index name"
end
else
index_name(table_name, index_name_options(options))
end
end
end
end
end
它创建像ix_assignments_on_case_id__project_id这样的索引,如果仍然太长,则将其截断为63个字符。如果表名很长,这仍然是非唯一的,但你可以增加一些复杂的东西,比如分别缩短表名和列名,或者检查唯一性。
注意,这是来自Rails 5.2项目;如果您决定这样做,请从您的版本中复制源代码。
为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 }
我有一个经常使用生成器的项目,需要它是自动的,所以我从rails源代码复制index_name函数来覆盖它。我在config/initializers/generated_index_name.rb中添加了这个:
# make indexes shorter for postgres
require "active_record/connection_adapters/abstract/schema_statements"
module ActiveRecord
module ConnectionAdapters # :nodoc:
module SchemaStatements
def index_name(table_name, options) #:nodoc:
if Hash === options
if options[:column]
"ix_#{table_name}_on_#{Array(options[:column]) * '__'}".slice(0,63)
elsif options[:name]
options[:name]
else
raise ArgumentError, "You must specify the index name"
end
else
index_name(table_name, index_name_options(options))
end
end
end
end
end
它创建像ix_assignments_on_case_id__project_id这样的索引,如果仍然太长,则将其截断为63个字符。如果表名很长,这仍然是非唯一的,但你可以增加一些复杂的东西,比如分别缩短表名和列名,或者检查唯一性。
注意,这是来自Rails 5.2项目;如果您决定这样做,请从您的版本中复制源代码。