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