2012-03-28 5 views
3

RailsプロジェクトでDataMapperを使用していて、モデルインスタンスまたはコレクションのいずれかでto_jsonを呼び出すと、JSONの循環参照エラーまたはと同じクエリの無限級数という異常な動作が発生することが判明しました。DataMapperのオブジェクトやコレクションで `to_json`が無限のクエリを引き起こすのはなぜですか?

が、これは私のモデル定義に問題だったと仮定すると、私はRailsのコンソールを開き、最も単純なモデル作成:

f = Foo.first 
f.to_json 
:このモデルのインスタンスを保存した後

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

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

を、私はこれをしませんでした

この時点で、プロセスはハングアップするようです。 I tail -f log/development.log場合、私はこのクエリを何度も実行を参照してください。

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

Rubyのメモリ使用量は、私がコマンドを中断またはRubyのプロセスを強制終了するまで成長を続けています。これは私の実際のモデルで持っていたのと同じ問題なので、モデルの定義が間違っているとは思われません。

この奇妙な動作は何が原因ですか?

+0

なぜこのようなことが起こるのか分かりませんが、dm-serializerのgemは 'to_json'という動作をしてくれます:https://github.com/datamapper/dm-serializer。私は少なくともこの問題を他の人がこの情報を見つけるためにウェブに載せたいと思っていました。 –

答えて

2

ActiveSupportで実装されているObject#to_jsonメソッドは、オブジェクトのすべての属性を直列化しているようです。 Datamapperは、メソッドを再帰的なtailspinに送信する自己参照変数(@_repository)を保持します。

dm-serializerの宝石(必要に応じて)が必要な機能を提供し、Railsは既にfix the problem in the dm-rails project(これはまだ起こっていない)の方法を既に述べています。

関連する問題