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

时间:2012-03-28 11:54:17

标签: 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进程。这与我的实际模型有同样的问题,因此我认为它与错误的模型定义无关。

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

1 个答案:

答案 0 :(得分:2)

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

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