Rails迁移修改tests表复合索引字段并同步至schema.rb的方法咨询
Rails 替换复合索引并同步schema.rb的操作方案
为什么手动修改schema.rb无效
schema.rb是Rails每次执行数据库结构操作时,从当前实时数据库的结构自动生成的快照文件。所有手动对这个文件的编辑,都会在下次运行迁移、加载数据库结构时被自动覆盖,这就是之前修改内容无法留存的核心原因。
具体操作步骤
- 生成专用的索引调整迁移文件,在项目根目录执行命令:
rails generate migration ReplaceTitleWithBodyInTestsCompositeIndex - 打开
db/migrate/目录下对应时间戳前缀的新生成迁移文件,写入索引变更逻辑:- 先删除原有的
title + level唯一复合索引 - 再创建替换后的
body + level唯一复合索引
参考代码:
class ReplaceTitleWithBodyInTestsCompositeIndex < ActiveRecord::Migration[你的项目使用的Rails主版本号] def change # 移除原有索引 remove_index :tests, column: [:title, :level] # 创建新的替换索引,保留唯一约束 add_index :tests, [:body, :level], unique: true end end - 先删除原有的
- 执行迁移命令完成数据库变更:
rails db:migrate
命令执行完成后,Rails会自动读取最新的数据库结构,将变更同步写入schema.rb,全程不需要手动编辑该文件。
注意事项
- 如果执行迁移时提示找不到原有的
title + level索引,可以先通过数据库查询命令查看tests表实际的索引名称,给remove_index传入name: "实际索引名"参数,定位到要删除的旧索引,避免迁移报错 - 不要为了图快直接手动修改
schema.rb的索引配置,这种操作会导致本地、测试环境、生产环境的数据库结构出现不一致,后续部署时会引发难以排查的问题
内容的提问来源于stack exchange,提问作者Southpaw
相关产品推荐
相关产品推荐

