2012-05-31 23 views
2

我想知道如何使這項工作。假設我有一個屬於客戶的項目模型。我想將這些特定的項目輸出到JSON,但他們需要按客戶端進行分組。我認爲這會工作:將ActiveRecord對象分組並輸出到JSON

@projects.group_by(&:client).to_json 

,幾乎工程,除to_json方法在客戶端上並沒有叫.to_json,因此對於客戶端,您得到這個在您的JSON:

"#<Client:0x1051d4fb0>":[{ "project":{"name":"My Only Project", "client_id":1}}] 

但我真的需要這樣的:

{"client":{"name":"Home Workers Unite", "id":1, "projects":[{"name":"My Only Project","client_id":1}]}} 

任何幫助表示讚賞!

+2

你想要的「json」無效。 - 屬性名稱必須是字符串。 –

+0

我不是在寫JSON,我只是在試圖修剪從Rails輸出的內容。我簡直不敢相信這不是一件容易的事,也是Rails核心的一部分。 –

+0

ps。哈希不是命令的。所以你不能有一個有序的散列。哈希包含零個或多個屬性名稱和值對。 –

回答

3

正如@LarryK所說的那樣,你想要的JSON不是有效的JSON。在JSON鍵只能是字符串不像紅寶石,可以有對象作爲鍵。另外,我建議json響應更像如下:

{clients: [ 
    { 
     "name":"Home Workers Unite", 
     "id":1, 
     "projects": [ 
     {"name":"My First Project", "id":1}, 
     {"name":"My Second Project", "id":2} 
     ] 
    } 
    ] 
} 

您已經有了可用的項目。您也有代碼將它們按客戶端進行分組,但在此產生的哈希上的一個簡單的to_json將不適用於此。您需要進一步處理分組的響應可以直接使用to_json

results = {clients: []} 
@projects.group_by(&:client).each do |client, projects| 
    results[:clients] << { 
    id: client.id, 
    name: client.name 
    projects: projects 
    } 
end 
results.to_json 

這是的Ruby/Rails解決方案的版本。但是,如果你有一個json重的應用程序,我會建議使用一些寶石(jbuilder,rabl,或任何其他)來創建所需的響應。

PS:代碼沒有測試

+0

謝謝!它不漂亮,但它的工作原理! –

+0

@rubish我採取了你的使用rabl的建議,你會介意幫我嗎http://stackoverflow.com/questions/30660136/include-group-by-parent-model-json-rabl –

1

我建議你看一下gem acts_as_api。 它使您可以非常容易地將對象作爲JSON來操作。

+0

對於直截了當的東西來說看起來不錯,但我不明白它在我的情況下會如何工作。例如,因爲我不想包含所有項目,所以不是簡單的父/子模板。 –

+0

那麼,有了這個寶石,你可以爲你想要的每種情況創建不同的範圍。它使用起來非常簡單,而且非常好。 例如,您可以使用僅顯示一個或兩個屬性的模板創建包含子流程的模板客戶端json。它非常可定製。 – MurifoX

0

由於您沒有項目數組的屬性名稱,因此您的orig帖子中的json無效json。

研究Murifox和其他來自railscasts的api技術的acts_as_api建議 - 他最近做了一個。

如果您的API用戶只想要一個客戶端的時間,你可以使用一個JSON結構,如:

{client: {"name":"Home Workers Unite", "id":1}, 
projects: [ 
     {"name":"My Only Project", "client_id":1} 
      ] 
} 

或者您也可以發送所需的客戶和項目信息的子集(或全部):

{clients: [ 
    {"name":"Home Workers Unite", "id":1}, 
    {"name":"Factory Workers Unite", "id":2}, 
      ], 
projects: [ 
     {"name":"My Only Project", "client_id":1}, 
     {"name":"Project 2", "client_id":2}, 
     {"name":"Project 3", "client_id":2} 
      ] 
} 

好處:從服務器到客戶端的API減少往返。