如何用子元素构建Mongoid对象的json对象?

时间:2013-01-11 19:18:09

标签: 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

我为测试目的创建了两个对象

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

我有下一个db状态:

> 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?

2 个答案:

答案 0 :(得分:4)

您可以覆盖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\"}]}"

答案 1 :(得分:1)

试试这个:

a_band = Band.last
a_band.as_json(methods: [:members])

Mongoid为您的关系自动生成帮助器方法,您可以在构建JSON对象时包含这些方法。您可以使用a_band.members从数据库中获取波段成员,因此您可以将该方法包含在JSON对象中,就像模型上的任何其他方法一样。