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 и смог регенерировать файл схемы без вышеуказанных ошибок.