【问题标题】:Rails nested association. in render :jsonRails 嵌套关联。在渲染中:json
【发布时间】:2014-11-04 20:25:28
【问题描述】:

现有问题已经让我完成了 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: 字段中,并且可以将其他元数据附加到响应中。

如何获得to_jsoninclude: 标志的效果,同时保留包装器对象?特别是,这对我来说不是一个有效的答案,因为它真的很难看:

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

谢谢!希望在 Rails 中有一种惯用的方式来做到这一点。

【问题讨论】:

  • 我强烈建议使用 Jbuilder 或 RABL 来格式化您的 JSON,而不是 .to_json。这两个 gem 都提供了更明确的 DSL 来格式化你的 JSON。
  • jbuilder 是你的朋友...
  • 是的,我已经知道 JBuilder,但我特别想知道我是否可以做到这一点:a) 没有to_json,b) 没有在我的项目中引入视图。如果它不可行,那很好,但很高兴我的响应生成如此明确。

标签: ruby-on-rails ruby json ruby-on-rails-4


【解决方案1】:

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

您将能够为装饰器提供模板和数据对象以进行渲染

【讨论】:

  • 我想看看是否可以避免在这种情况下使用模板,但似乎不行。嗯,无论如何,谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-10-22
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多