2015-06-01 280 views
1

我要創造我的Rails應用程序數據的強制佈局圖作爲here in d3從數據庫查詢創建JSON軌

我有表按如下圖Rails應用程序:

enter image description here

我想在控制器中創建一個表達式,可以輸出所需格式的JSON:

{ 
    "user":[ 
    {"name":"Myriel"}, 
    {"name":"Napoleon"}, 
    {"name":"Mlle.Baptistine"} 
    ], 
    "relationship":[ 
    {"source":1,"target":0}, 
    {"source":2,"target":0}, 
    {"source":3,"target":0} 
] 
} 

我想這將涉及在控制器 - 有點像查詢:

class GraphController < ApplicationController 
    def data 
    render :json => User.select('name') 
    render :json => Relationship.select('follower_id') & Relationship.select('followed_id') 
    end 
end 

但後來我怎麼了JSON輸出組合成一個按照上面的例子?以及如何重新命名輸出,使follower_id變成源代碼,followed_id變成目標?

回答

1

你有好幾個選擇:

  1. 您可以構建相應的結構,然後將它傳遞給render,就像這樣:

    render json: { 
        user: User.select('name')].map { |u| 
        { name: u.name } 
        }, 
        relationship: Relationship.select(:follower_id, :followed_id).map { |r| 
        { source: r.follower_id, target: r.followed_id } 
        } 
    } 
    
  2. 前一種方法的工作原理,但它可能變得非常複雜。此時,您可能應該考慮通過單獨的視圖圖層進行JSON渲染。它可以是任何你喜歡的東西:

    • ERB,這是非常異國情調,我從來沒有見過它在野外,但仍然非常可行;你應該能夠命名你的模板,如show.json.erb,並從那裏去
    • 一個單獨的類,將建立像選項no。 1將被呈現在JSON中,一種主持人
    • ...最後,這似乎是最適合我的,一些特定於JSON的呈現引擎:RABL,JBuilder或其他,有一大堆那裏

但是,不應該低估從這樣的控制器渲染JSON被認爲是難聞的氣味。在控制器中查看代碼違背了基於Rails的MVC。

這給我們留下了一種選擇#2的味道,無論是否符合手頭任務的複雜性(根據您自己的直覺)。

希望這會有所幫助!

+0

好的,謝謝你的幫助。 JBuilder看起來很容易使用。我沒有得到的唯一的事情是如何實際然後參考Jbuilder創建的Json。它並沒有創建一個物理文件,所以當我試圖在ajax調用中使用它時,我將它稱爲它? –

+0

我可能不會100%真正理解你,但是......它非常像Rails中的其他視圖引擎。它被調用爲Rails控制器操作的一部分。所以默認的結果直接寫入響應流。就像「ERB(HAML/SLIM/whatever)到HTML」一樣。 – SkyWriter