Почему сериализация ActiveRecord случайно искажает мои данные?

Я использую serialize в одной модели ActiveRecord для сериализации Array простых хэшей в поле текстовой базы данных. Я даже использую второй параметр для принудительной десериализации в Array s.

class Shop < ActiveRecord::Base
 serialize : recipients, Array
end

Кажется, что все нормально, но после нескольких запросов содержимое recipients превращается в хеши HashOfIndifferentAccess вместо массивов. Это происходит только после нескольких перезагрузок моделей, и я не смог воспроизвести их в тестах или консоли, только в рабочей среде.

2 ответа

У меня была такая же проблема с некоторыми сериализованными полями в одном из моих приложений Rails 3.1. После многих проблем с поиском я сузил его до проблемы кодирования символов. Я не смог воспроизвести его локально, потому что я использовал SQLite, в то время как моя производственная среда была на Postgres.

Попробуйте применить some_field.force_encoding(Encoding::UTF_8) для всех значений до их сериализации и посмотреть, что произойдет.


Это похоже на то, что вы должны иметь возможность воспроизводить локально с достаточным количеством тестов. Просмотрите свои производственные данные и журналы и попытайтесь использовать те же данные в своих локальных тестах.

Хеширование не зависит от контроллера. Возможно, вы берете данные прямо с контроллера и не массируете его вообще.

Создайте сущность своей страницы, контроллера и кода сохранения модели и обновите этот вопрос. В зависимости от того, насколько глубоко вложен ваш хэш, вы можете преобразовать хэш HWIA в обычный, прежде чем сохранять.

Не следует слишком сложно отлаживать и разрешать.

licensed under cc by-sa 3.0 with attribution.