2013-01-11 32 views
3

我有兩個簡單的類如何用子對象構建一個Mongoid對象的json對象?

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("...") } 

當我嘗試建立JSON對象樂隊對象我得到的數據沒有兒童:

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

但我需要類似的東西:

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

如何構建JSON帶孩子?

回答

1

試試這個:

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

Mongoid會爲您的關係自動生成幫助器方法,並且您可以在構建JSON對象時包含這些方法。您可以使用a_band.members將樂隊成員從數據庫中取出,因此您可以將該方法包含在您的JSON對象中,就像模型上的其他任何方法一樣。

+0

對此的一個警告:似乎所有的'.as_json()'選項都會傳遞給任何嵌套的對象,例如,如果您有'a_band.as_json(只:[:名稱],方法:[:members ])',那麼成員只會包含'name'屬性。例如,如果你想要他們的年齡,你必須手動包含該字段,比如'a_band.as_json(只有:[:name,:age],方法:[:members])' – colllin

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\"}]}" 
+0

您不必重複'serializable_hash'。只需致電超級並添加新成員即可。 'def serializable_hash(options = {}); hash = super(options); hash [:members] = ...;散列;結束' – zhon