2010-08-11 117 views
36

聲明,我對Rails瞭解甚少。我會盡量簡潔。 Rails中 考慮下面的模型關係:Rails對象關係和JSON渲染

class ModelA < ActiveRecord::Base 
    belongs_to :ModelB 

... 

class ModelB < ActiveRecord::Base 
    has_many :ModelA 

當調用MODELA控制器返回的JSON應該表明是對象B,其中的對象A的問題是一個孩子的孩子們都ObjectAs的表演動作。

所以,如果我有一個包含ID 1,2和3,然後訪問的對象A的一個對象B:/modela/1.json

我應該看到:

{ 
    "modelb": { 
    "id": "1", 
    "modela": [insert the ModelA JSON for ID's 1, 2 and 3] 
    } 
} 
+0

你能分享你的控制器代碼(特別是正在執行的查詢)嗎? – Brian 2010-08-11 21:11:52

+0

控制器非常龐大。這個查詢只是@tour = Tour.find(params [:id]) – 2010-08-11 21:20:14

+0

testtesttesttest – 2017-08-15 17:31:09

回答

100

默認情況下你」在上面的例子中只會得到代表modelb的JSON。但是,你可以告訴Rails包括其他相關的對象,以及:

def export 
    @export_data = ModelA.find(params[:id]) 
    respond_to do |format| 
    format.html 
    format.json { render :json => @export_data.to_json(:include => :modelb) } 
    end 
end 

你甚至可以告訴它排除某些領域,如果你不希望看到他們在出口:

render :json => @export_data.to_json(:include => { :modelb => { :except => [:created_at, updated_at]}}) 

或者,只包括某些字段:

render :json => @export_data.to_json(:include => { :modelb => { :only => :name }}) 

你可以窩那些儘可能深,你需要(讓我們說,ModelB也HAS_MANY ModelC):

render :json => @export_data.to_json(:include => { :modelb => { :include => :modelc }}) 

如果要包括多個子模型關聯,您可以執行以下操作:

render :json => @export_data.to_json(include: [:modelA, :modelB, :modelN...]) 
+4

如果你想要多個include,你需要添加一個數組:'@ whatever.to_json(include:[:modelA,:modelB,: modelN ...])'。 – Automatico 2013-08-31 09:22:07

+0

如果我想在視圖中調用此導出函數以從特定模型中提取屬性,我該如何調用它? – Scalahansolo 2014-04-11 05:59:43

0

如果你想有一個更靈活的方法來處理JSON,您可以考慮使用寶石的JBuilder:https://github.com/rails/jbuilder

它允許您以便捷的方式呈現自定義屬性,實例變量,關聯以及重用json partials。