Mongoid 3.1渴望加载,json和字段名称

时间:2013-03-26 17:41:03

标签: mongoid mongoid3

最近从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'键下。我怀疑我在这里遗漏了一些东西。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以为:include指定to_json选项,如下所示:

m.to_json(include: :band)

JSON将有一个键band,Band对象转换为JSON,band_id仍然存在。