最近、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'ではなくキー':band_id'の下に保存されるのはなぜですか?':band'は保護されていると思いますが、それでもデータを':band_id'キーの下に保存する必要はないと思います。ここで何かが足りないのではないかと思います。何か案は?