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

4

1 に答える 1

1

次のような:includeオプションを指定できます。to_json

m.to_json(include: :band)

bandJSONには、BandオブジェクトがJSONに変換されたキーがあり、band_id引き続き存在します。

于 2013-03-27T07:45:04.510 に答える