You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:42:18