最近从3.0.3更新到Mongoid 3.1,这导致了一些破碎的代码和混乱。
假设您有一对具有belongs_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'键下。我怀疑我在这里遗漏了一些东西。有什么想法吗?
答案 0 :(得分:1)
您可以为:include
指定to_json
选项,如下所示:
m.to_json(include: :band)
JSON将有一个键band
,Band对象转换为JSON,band_id
仍然存在。