Rails 中 DataMapper 对象的替代序列化

发布于 2024-11-03 14:47:09 字数 442 浏览 1 评论 0原文

我正在 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) 方法似乎并没有将它与所有外键和其他东西联系起来。

I'm working on on a caching layer in my Rails app and I'm having trouble caching original DataMapper objects. They seem to have a lot of stuff attached that make marshaling fail (I get an error about Marshal being unable to serialize a Proc object).

So I am considering writing my own pre-serialization and post-deserialization methods for caching. Specifically I will turn the DataMapper object into a list of tuples with this:

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

And then cache that list.

My question is: How do I reconstruct the DataMapper object in a way that allows me to use it as it if were constructed by a normal DataMapper query?

My naive approach of Foo.new(foo=bar, goo=baz) doesn't seem to connect it up with all of the foreign keys and stuff.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你在看孤独的风景 2024-11-10 14:47:09

经过一些“有趣的”代码探索之后,我似乎找到了一些有用的东西:

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

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

模型上的 load 方法似乎是 get 使用的,而 query 似乎是必需的为了获取存储库名称和其他一些东西。

After some "fun" code-spelunking I seem to have found something that works:

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

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

The load method on the model seems to be what get uses and the query seems to be required in order to get the repository names and a few other things.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文