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

Ruby 为什么DataMapper对象和集合上的“to_json”会导致无限查询?,ruby,json,serialization,datamapper,Ruby,Json,Serialization,Datamapper,我在一个Rails项目中使用DataMapper,发现在模型实例或集合上调用以_json会导致奇怪的行为:json中的循环引用错误,或者相同查询的无限系列 假设这是我的模型定义的问题,我打开了一个Rails控制台并创建了最简单的模型: class Foo include DataMapper::Resource property :id, Serial property :name, String end Foo.auto_migrate! # create db table `

我在一个Rails项目中使用DataMapper,发现在模型实例或集合上调用
以_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),该变量将方法发送到递归tailspin中


好消息是dm serializer gem(正如您所提到的)提供了必要的功能,Rails已经说明了如何(只是还没有发生)。

虽然我不知道为什么会发生这种情况,但dm serializer gem为我提供了对json的工作
行为:。我想至少把这个问题放到网上,让其他人找到这些信息。