0

最近从 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 中能够像这样返回一个“成员”对象:

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

4

1 回答 1

1

您可以像这样指定一个:include选项to_json

m.to_json(include: :band)

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

于 2013-03-27T07:45:04.510 回答