Rails执行数据库迁移后schema.rb出现hash rockets如何改回新语法
问题原因
这个问题不是Ruby或Rails核心的语法配置问题,是Rails 6.1配套的旧版activerecord-postgis-adapter(PostGIS的ActiveRecord适配层)的schema导出逻辑bug:处理geometry这类空间字段的limit参数时,直接调用了原生哈希的inspect方法输出,默认会生成:key=>value格式的旧版hash rockets写法,没有走Rails内置的新版哈希语法格式化逻辑。
出问题时的diff表现如下:
- t.geometry "column", limit: { srid: 1234, type: "st_point" } + t.geometry "column", limit: {:srid=>1234, :type=>"st_point"}
修复方法
临时修正当前文件
如果只是要把当前已经生成的db/schema.rb改回新版语法,两种方式都可以:
- 项目用了RuboCop的话,直接跑单行命令自动修正,只会调整哈希写法,不会改动字段配置、版本号等其他有效内容:
rubocop -a db/schema.rb --only Style/HashSyntax
- 没装RuboCop直接手动改对应行的哈希格式就行,文件里只有空间字段的配置会出这个问题,改动量很小。
根治后续重复生成问题
只改当前文件的话,下次跑rails db:migrate重新导出schema的时候旧格式还会回来,要彻底解决选下面任意一种方案:
- 优先把
activerecord-postgis-adapter升级到6.1对应大版本的最新补丁版,官方已经在后续补丁里修复了这个导出格式问题,升级完重新跑一次迁移,生成的schema.rb就会默认用key: value的新版哈希写法。 - 暂时没法升级适配器版本的话,可以把上面的rubocop修正命令配成迁移任务的后置钩子,每次迁移跑完自动修正格式;也可以自己写个简单的初始化补丁,重写空间字段的参数导出逻辑,强制输出新版语法。
注意:不要为了规避这个问题把
db/schema.rb加入git忽略列表,这个文件是项目数据库结构的统一记录,必须纳入版本控制。
内容的提问来源于stack exchange,提问作者I. Khan
相关产品推荐
相关产品推荐

