Как сказать Ruby не сериализовать атрибут или как правильно перегрузить marshal_dump? - PullRequest
2 голосов
/ 04 мая 2010

У меня есть атрибут в моем AR: B, который не сериализуем.

o = Discussion.find(6)
Marshal.dump(o)

TypeError: no marshal_dump is defined for class Proc
       from (irb):10:in `dump'

Я знаю виновника, и я хочу установить эту переменную на ноль до какой-либо сериализации.

Я могу сделать это, но я застрял в правильном способе переопределения marshal_dump

 def marshal_dump
   @problem = nil
   # what is the right return here?
 end

Или есть способ сказать Ruby или AR не сериализовать объект?

1 Ответ

2 голосов
/ 04 мая 2010

Ваш специализированный marshal_dump должен вернуть объект, содержащий данные, которые вы хотите сериализовать. Этот объект будет передан обратно marshal_load во время загрузки.

В этом случае я предполагаю, что данные, которые вы хотите выгрузить, соответствуют всем атрибутам AR (и только им), поэтому я бы попробовал:

def marshal_dump
  attributes
end

def marshal_load(data)
  send :attributes=, data, false  # false to override even protected attributes
end
...