Почему `to_json` для объектов и коллекций DataMapper вызывает бесконечные запросы? - PullRequest
3 голосов
/ 28 марта 2012

Я использую DataMapper в проекте Rails и обнаружил, что вызов 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 Ответ

2 голосов
/ 28 июня 2012

Кажется, что метод Object # to_json, реализованный ActiveSupport, сериализует все атрибуты объекта.Datamapper поддерживает независимую переменную (@_repository), которая отправляет метод в рекурсивный штопор.

Хорошая новость заключается в том, что гем dm-serializer (как вы уже упоминали) предоставляет необходимую функциональность, а Rails ужеуказано, как исправить проблему в проекте dm-rails (этого еще не произошло).

...