4

私は2つの簡単なクラスを持っています

class Band
  include Mongoid::Document
  field :name, type:String
  has_many :members
end

class Member
  include Mongoid::Document
  field :name, type: String
  belongs_to :band
end

テスト目的で 2 つのオブジェクトを作成した後

Band.create(title: 'New Band')
Band.members.create(name: 'New Member')

次のデータベース状態を取得しました:

> db.bands.find()
{ "_id" : ObjectId("..."), "title" : "New Band" }
> db.members.find()
{ "_id" : ObjectId("..."), "name" : "New Member", "band_id" : ObjectId("...") }

Band オブジェクトの json オブジェクトを構築しようとすると、子のないデータが取得されます。

{"_id":"...","title":"New Band"}

しかし、私はそのようなものが必要です:

{"_id":"...","title":"New Band", "members" : {"_id":"...","title":"New Member"}}

子供と一緒にjsonを構築する方法??

4

2 に答える 2

5

オーバーライドできますserializable_hash:

class Member
  include Mongoid::Document
  field :name, type: String
  belongs_to :band

  def serializable_hash(options={})
    {
      id: id,
      name: name
    }
  end
end

class Band
  include Mongoid::Document
  field :title, type: String
  has_many :members

  def serializable_hash(options={})
    {
      id: id,
      title: title,
      members: members.inject([]) { |acc, m| acc << m.serializable_hash; acc }
    }
  end  
end

次のメンバーがいるバンドがあるとします。

band = Band.create(title: 'New Band')
band.members.create(name: 'New Member')

その場合band.to_json、次のようなものが返されます。

"{\"id\":...,\"title\":\"New Band\",\"members\":[{\"id\":...,\"name\":\"New Member\"}]}"
于 2013-01-11T19:58:01.527 に答える