Rails 4, Ruby 2.7.1 schema.rb показывает "Не удалось создать дамп таблицы из-за ошибки FrozenError"

После обновления до 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 на этой стадии - не вариант.

У кого-нибудь была подобная ситуация и удалось ее разрешить?

2 ответа

Если кто-то еще это ищет.

Ошибка связана с тем, что в старой версии rails дампер схемы использовал для преобразования значения столбца базы данных по умолчанию в строку, а затем выполнял операции с этой строкой. Но в ruby 2.7 то to_s метод для nil, true and false вернуть замороженную строку и, следовательно, FrozenError, поэтому, если обновление версии rails не является вариантом, вы можете просто поместить это в инициализатор, чтобы переопределить метод дампера схемы для использования dup вместо фактической строки.

      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

Я знаю, что вы упомянули, что понижение версии RUby для вас не вариант.

Но если вы можете понизить версию Ruby, вот что сработало для меня.

Как отметил rmlockerd это проблема Ruby 2.7 .

В итоге я понизил свою версию Ruby до 2.6.6.

После понижения версии моего Ruby я запустил db:schema:load и смог регенерировать файл схемы без вышеуказанных ошибок.

Другие вопросы по тегам