Альтернативная сериализация для объектов DataMapper в Rails - PullRequest
3 голосов
/ 26 апреля 2011

Я работаю над уровнем кэширования в своем приложении Rails, и у меня возникают проблемы с кэшированием оригинальных объектов DataMapper. Кажется, к ним прикреплено много вещей, которые приводят к сбою маршалинга (я получаю сообщение о том, что Marshal не может сериализовать объект Proc).

Итак, я рассматриваю возможность написания собственных методов предварительной сериализации и последующей десериализации для кэширования. В частности, я превращу объект DataMapper в список кортежей со следующим:

o = Foo.get(1234)
as_list = o.model.properties.map { |p| [p.name, o.send(p.name)] }

А затем кешировать этот список.

У меня такой вопрос: как мне реконструировать объект DataMapper таким образом, чтобы я мог использовать его так, как если бы он был создан с помощью обычного запроса DataMapper?

Мой наивный подход Foo.new(foo=bar, goo=baz), похоже, не связывает его со всеми внешними ключами и прочим.

1 Ответ

1 голос
/ 27 апреля 2011

После некоторого "забавного" написания кода я, кажется, нашел кое-что, что работает:

mc.set(key, HashWithIndifferentAccess[o.attributes])

as_hash = mc.get(key)
from_cache = Foo.load([as_hash], Foo.all.query).first

Метод load в модели, кажется, является тем, что получает использование, и query, кажется, требуется для получения имен репозитория и некоторых других вещей.

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