我在 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/