2014-11-04 120 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