现有的问题让我90%的方式达到了我的目标,但是有一个障碍。
我有一个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:
字段中,其他元数据可以附加到响应中。
如何在保留包装器对象的同时获得include:
的{{1}}标志的效果?特别是,这对我来说不是一个有效的答案,因为它真的很难看:
to_json
谢谢!希望在Rails中有一种惯用的方法。
答案 0 :(得分:3)
Active Records支持预先加载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
您将能够为装饰者提供模板和数据对象来呈现