我有两个简单的类
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?
答案 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对象中,就像模型上的任何其他方法一样。