2014-11-04 158 views
1

現有的問題已經讓我達到我想要的90%的方式,但有一個困難。Rails嵌套關聯。在渲染:json

我有一個CheckIns模型,和一個Person模型。 CheckIns屬於People

在我的控制,我有這樣的代碼:

data = CheckIn.all 
render json: { data: data } 

對於每個CheckIn,我想窩在它的相關Person。過去StackOverflow的問題,建議我這樣做:

data = CheckIn.all 
render json: data.to_json include: :person 

但是,這使得它很難窩我的數據的包裝JSON對象裏面,就像我原來的,因爲to_json創建一個字符串,而不是Hash

我想包裝JSON對象,以便我可以遵循標準化的JSON輸出,其中data總是在data:字段中,並且其他元數據可以附加到響應。

如何獲得to_jsoninclude:標誌的效果,同時還保留包裝對象?特別是,對我來說這不是一個有效的答案,因爲它確實很難看:

data = CheckIn.all 
render json: { data: JSON.parse data.to_json(include: :person) } 

謝謝!希望在Rails中有這樣的慣用方法。

+0

我強烈建議使用JBuilder或Rabl的,以您的格式JSON而不是.to_json。這兩個寶石都提供了更加明確的DSL來格式化您的JSON。 – 2014-11-04 20:36:43

+0

jbuilder是你的朋友... – 2014-11-04 22:56:36

+1

是的,我已經知道JBuilder了,但我特別想知道如果我沒有'to_json',我可以做這些東西a)沒有向我的項目引入視圖。如果它不可行,那很好,但我的迴應代是如此明確是很好的。 – 2014-11-05 00:47:38

回答

3

活動記錄支持預先加載與用戶相關http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations

裝載籤:

@users = User.all.includes(:checkins) 

將查詢:

User Load (0.2ms) SELECT "users".* FROM "users" 
Checkin Load (0.1ms) SELECT "checkins".* FROM "checkins" WHERE "checkins"."user_id" IN (1) 

但是這不會讓你呈現你的嵌套的對象,你正在尋找的東西來裝飾你的數據

看看https://github.com/nesquena/rabl或github.com/rails/jbuilder

您將能夠提供與裝飾模板和數據對象來呈現

+1

我想看看在這種情況下是否可以避免使用模板,但似乎沒有。啊,謝謝不管! – 2014-11-08 05:10:25