Rails控制器包含在

时间:2018-04-05 20:53:40

标签: ruby-on-rails json api model-view-controller include

我有Ruby on Rails API,我想渲染一个包含所有已分配数据的模型(在多个级别上)。我的模型结构如下所示:

class Race < ApplicationRecord
    has_many :efforts, :dependent => :delete_all
end

class Effort < ApplicationRecord
    belongs_to :race
    has_many :segment_efforts, :dependent => :delete_all
end

class SegmentEffort < ApplicationRecord
    belongs_to :effort

因此,当用户调用/ race / 1时,他应该获得ID为1的所有努力,属于第1场的所有努力以及属于所选努力的所有segmentefforts。在轨道上有可能吗?我只发现,您可以使用:inlude渲染关联对象,如下所示:

render json: @race.to_json(:include => [:efforts])

但是我想知道,如果在某种程度上可以在工作中加入分段工作,那么这将是一个明智的做法。或者可能有更好的方法来加载这些资源?

1 个答案:

答案 0 :(得分:0)

是的,您可以使用jbuilder构建更强大的JSON结构来响应查询。

首先,您要确保SQL查询有效。如果您使用预先加载,Rails将为您处理:

@race = Race.includes(efforts: :segment_efforts).find(params[:id])

然后你的观点看起来像这样:

# app/views/races/show.json.jbuilder
json.(@race, :name, :foo)
json.efforts(@race.efforts) do |effort|
  json.effort_name effort.name
  json.someother_attr effort.someother_attr
  json.segment_efforts(effort.segment_efforts, :another_attr)
end

请务必查看jbuilder examples以了解语法的可能性。