Почему ActiveRecord сериализует случайным образом испортить мои данные? - PullRequest
3 голосов
/ 02 октября 2008

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

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

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

Ответы [ 2 ]

2 голосов
/ 19 сентября 2012

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

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

1 голос
/ 13 сентября 2012

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

Доступ к хешу с помощью интерфейса происходит из контроллера. Возможно, вы берете данные прямо с контроллера и не массируете их вообще.

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

Не должно быть слишком сложно для отладки и разрешения.

...