我在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进程。这与我的实际模型有同样的问题,因此我认为它与错误的模型定义无关。
导致这种奇怪行为的原因是什么?
答案 0 :(得分:2)
似乎由ActiveSupport实现的Object#to_json方法序列化了对象的所有属性。 Datamapper维护一个自引用变量(@_repository),该变量将该方法发送到递归的tailspin。
好消息是dm-serializer gem(正如你所提到的)提供了必要的功能,Rails已经说明了如何fix the problem in the dm-rails project(它还没有发生)。