ruby - 为什么 DataMapper 对象和集合上的 `to_json` 会导致无限查询?

标签 ruby json serialization datamapper

我在 Rails 项目中使用 DataMapper,发现在模型实例或集合上调用 to_json 会导致奇怪的行为:来自 JSON 的循环引用错误,或 无限系列的相同查询

假设这是我的模型定义的问题,我打开了一个 Rails 控制台并创建了尽可能简单的模型:

class Foo
  include DataMapper::Resource
  property :id, Serial
  property :name, String
end

Foo.auto_migrate!  # create db table `foos` for this model

保存这个模型的实例后,我这样做了:

f = Foo.first
f.to_json

此时,进程似乎挂起。如果我 tail -f log/development.log,我会看到这个查询一遍又一遍地执行:

SQL (0.084ms)  SELECT `id`, `name` FROM `foos` ORDER BY `id`

Ruby 的内存使用量持续增长,直到我中断命令或终止 Ruby 进程。这与我在实际模型中遇到的问题相同,因此我认为这与错误的模型定义无关。

是什么导致了这种奇怪的行为?

最佳答案

似乎由 ActiveSupport 实现的 Object#to_json 方法序列化了对象的所有属性。 Datamapper 维护一个自引用变量 (@_repository),该变量将方法发送到递归困惑中。

好消息是 dm-serializer gem(正如您提到的)提供了必要的功能,并且 Rails 已经说明了如何 fix the problem in the dm-rails project (只是还没有发生)。

关于ruby - 为什么 DataMapper 对象和集合上的 `to_json` 会导致无限查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9906954/

相关文章:

python - 为什么 ruby​​ `require` 不是更细粒度的?

ruby - 检查是否定义了局部变量,因为它在 ruby​​ 中的名称为字符串

javascript - 结果数据的意义

json - 如何使用 Groovy 从 JSON 响应中获取大量数字

相似对象映射的 json 模式

ruby rexml 获取子元素

ruby - 传递哈希而不是方法参数

c# - 原始类型的最佳序列化

java - 更改 Jackson 中的默认序列化行为

Python:如何从平面数据结构创建嵌套 XML