如何用孩子建立一个Mongoid对象的json对象?

Den*_*hin 4 ruby mongoid

我有两个简单的课程

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
Run Code Online (Sandbox Code Playgroud)

在创建两个对象以进行测试之后

Band.create(title: 'New Band')
Band.members.create(name: 'New Member')
Run Code Online (Sandbox Code Playgroud)

我得到了下一个数据库状态:

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

当我尝试构建Band对象的json对象时,我得到的数据没有子级:

{"_id":"...","title":"New Band"}
Run Code Online (Sandbox Code Playgroud)

但是我需要这样的东西:

{"_id":"...","title":"New Band", "members" : {"_id":"...","title":"New Member"}}
Run Code Online (Sandbox Code Playgroud)

如何与孩子建立json?

Vol*_*ldy 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
Run Code Online (Sandbox Code Playgroud)

假设您有一个成员乐队:

band = Band.create(title: 'New Band')
band.members.create(name: 'New Member')
Run Code Online (Sandbox Code Playgroud)

在这种情况下,band.to_json您会得到如下信息:

"{\"id\":...,\"title\":\"New Band\",\"members\":[{\"id\":...,\"name\":\"New Member\"}]}"
Run Code Online (Sandbox Code Playgroud)