如何在Ruby on Rails ActiveRecord迁移中处理太长的索引名称?
我试图添加一个从四个相关表的外键创建的唯一索引:
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个字符
我怎么处理这个? 我可以指定不同的索引名称吗?
为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
相同的选项哈希作为其值。
您还可以在create_table
块中更改列定义中的索引名称(例如,您从迁移生成器获取)。
create_table :studies do |t| t.references :user, index: {:name => "index_my_shorter_name"} end
在PostgreSQL中, 默认限制为63个字符 。 因为索引名称必须是唯一的,所以有一点约定是很好的。 我使用(我调整了示例来解释更复杂的结构):
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
- 按字母顺序
通常这项工作。
你也可以这样做
t.index([:branch_id, :party_id], unique: true, name: 'by_branch_party')
就像Ruby on Rails API一样 。
与上一个答案类似:只需在常规add_index行中使用“name”键:
def change add_index :studies, :user_id, name: 'my_index' end
- Rake:记录任何正在执行的任务
- 如何强制send_data在浏览器中下载文件?
- OmniAuth Railscast中的DangerousAttributeError教程:create由ActiveRecord定义
- Carrierwave / Fog – 参数错误,提供程序无法识别
- 如何在Rails 4应用程序中向form_for帮助器添加一个类?
- MySQL + Rails:错误:150“外键约束不正确”
- Capistrano 3 + Sprockets 3 + Rails 4.2.1不会部署?
- 将Ruby控制台输出写入文本文件
- 使用装饰器,(rails)无法推断ActiveRecord :: Base的装饰器