4

我有两个简单的课程

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.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 回答
2

试试这个:

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

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

于 2014-02-03T16:43:09.283 回答