Mongoid 3.1 нетерпеливая загрузка, JSON и имена полей
Недавно обновленный до Mongoid 3.1 от 3.0.3, и это привело к некоторому испорченному коду и путанице с моей стороны.
Допустим, у вас есть пара классов с отношением own_to/has_many, например:
class Band
include Mongoid::Document
field :name, type: String
has_many :members, :autosave => true
end
class Member
include Mongoid::Document
field :name, type: String
belongs_to :band
end
Сохранение всего этого в базу данных примерно так:
b = Band.new
b.name = "Sonny and Cher"
b.members << Member.new(name: "Sonny")
b.members << Member.new(name: "Cher")
b.save
Я бы в своем API смог вернуть объект 'member', например, так:
m = Member.where(name: "Sonny").first
m.to_json
что дает следующее, как и ожидалось:
{"_id":"<removed>","band_id":"5151d89f5dd99dd9ec000002","name":"Sonny"}
Мой клиент может запросить объект полной полосы с последующим вызовом, если он этого хочет. Тем не менее, в некоторых случаях я действительно хочу включить ссылочный элемент напрямую. С 3.0.3 я бы просто сделал следующее:
m = Member.where(name: "Sonny").first
m[:band] = m.band
m.to_json
и это добавит новое поле с полной информацией о полосе. С 3.1, однако (возможно, он был запущен в более ранних версиях, но я не тестировал), я теперь получаю это:
{"_id":"<removed>","band_id":{"_id":"5151dc025dd99d579e000002","name":"Sonny and Cher"},"name":"Sonny"}
Итак, похоже, что информация о группе была загружена в поле? Почему он хранится под ключом ':band_id', а не ':band'? Я предполагаю, что ': band' защищен, но я все еще не думаю, что данные должны храниться под ключом ':band_id'. Я подозреваю, что я что-то здесь упускаю. Есть идеи?
1 ответ
Вы можете указать :include
вариант для to_json
вот так:
m.to_json(include: :band)
JSON тогда будет иметь ключ band
с объектом Band, преобразованным в JSON и band_id
все еще будет присутствовать.