Проблема сериализации ActiveRecord - PullRequest
2 голосов
/ 26 июля 2010

У меня есть столбец db, который является сериализованным Hash:

class Foo < ActiveRecord::Base
   serialize :bar
end

Когда я сохраняю хеш внутри бара глубиной в несколько уровней, более глубокие уровни, кажется, не десериализуются должным образом, когдаОни нужны мне.Объекты одного уровня глубоко десериализуются просто отлично.Однако объекты глубиной 2 или более уровней остаются классами YAML.

Я попытался десериализовать вручную, используя YAML :: load (), но получил ошибку, утверждая, что аргумент не является экземпляром IO.

Кто-нибудь знает, почему полный объект Ruby не десериализуется?

РЕДАКТИРОВАТЬ : После дальнейшего изучения проблема, как представляется, связана с тем, что я звонювиртуальный атрибут из сериализованного YAML.

class Foo < ActiveRecord::Base
   serialize :bar
end

class Bar < ActiveRecord::Base
    attr_accessor :enabled
end

@bars = @foo.bar[:bars]
@bars.each do |bar|
   puts bar.enabled
end

выход:

NoMethodError: undefined method `enabled' for #<YAML::Object:0xb6f11844>
    from (irb):12
    from (irb):11:in `each'
    from (irb):11
    from :0

Означает ли это, что десериализация не является "реальной", т. Е. Объект YAML действует подобно исходному объекту, ноэто не фактический экземпляр этого объекта?

Ответы [ 2 ]

4 голосов
/ 26 июля 2010

При сериализации пользовательских объектов следует помнить о двух вещах, а не о «старых старых объектах Ruby».

  • Вам необходимо загрузить пользовательские классы, прежде чем объект сможет быть должным образомдесериализованный или экземпляры будут иметь общий тип YAML :: Object.Десериализация не приводит к автоматической загрузке классов.
  • Некоторые объекты могут неправильно сериализоваться без какой-либо настройки, хотя обычно это не так.

Обычно сериализация экземпляров ActiveRecord:Базовый объект - плохая идея, так как в нем есть необычайное количество багажа, которое необходимо будет кодировать в дополнение к вашему атрибуту.Лучше всего создать класс, производный непосредственно от Object, который является поведением по умолчанию, или от какого-то простого базового класса.

1 голос
/ 28 января 2012

Это решение для вложенной десериализации YAML, если оно помогает: Проблема сериализации класса Ruby on Rails от автора etienne.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...