6

升级到 Ruby 2.7.1 后,我的 schema.rb 出现了多个表的以下警告:

# Could not dump table "pages" because of following FrozenError
#   can't modify frozen String: "false"

# Could not dump table "proxies" because of following FrozenError
#   can't modify frozen String: "true"

我已经到处寻找解决方案,并检查了(尽我所能)迁移,其中有很多。在这个阶段降级 Ruby 不是一种选择。

有人遇到类似情况并设法解决了吗?

4

2 回答 2

3

如果有人还在寻找这个。

该错误是因为在旧版本的 rails 中,模式转储程序使用to_s将数据库默认列值转换为字符串,然后对该字符串执行操作。但是在返回冻结字符串ruby 2.7to_s方法中,因此如果升级 rails 版本不是一个选项,您可以将其放在初始化程序中以覆盖模式转储方法以使用而不是实际字符串。nil, true and falseFrozenErrordup

module ActiveRecord
  module ConnectionAdapters
    module ColumnDumper
      def prepare_column_options(column, types)
        spec = {}
        spec[:name]      = column.name.inspect
        spec[:type]      = column.type.to_s
        spec[:null]      = 'false' unless column.null

        limit = column.limit || types[column.type][:limit]
        spec[:limit]     = limit.inspect if limit
        spec[:precision] = column.precision.inspect if column.precision
        spec[:scale]     = column.scale.inspect if column.scale

        default = schema_default(column).dup if column.has_default?
        spec[:default]   = default unless default.nil?

        spec
      end
    end
  end
end

于 2021-08-09T07:38:30.023 回答
0

我知道你提到降级 RUby 不是你的选择。

但是,如果您能够降级 Ruby,这对我有用。

这是rmlockerd指出的 Ruby 2.7 问题。

我最终将我的 Ruby 版本降级为“2.6.6”。

降级我的 Ruby 后,我运行 db:schema:load 并能够重新生成模式文件而没有上述错误。

于 2021-06-28T16:15:37.153 回答