【问题标题】:How to include nested associations in JSON after creating an object?创建对象后如何在 JSON 中包含嵌套关联?
【发布时间】:2020-04-07 13:43:17
【问题描述】:

一个小队有很多玩家。如果我尝试创建一个新小队,没关系,但它不会返回包含控制台中包含的球员的 JSON。

这是我在控制器上创建 def 的代码:

def create
  squad = Squad.create(squad_params)
  render json: squad
end

这是我在模型中的序列化器:

def serializable_hash(opts)
  super(opts.merge(only: [:id, :name, :user_id], include: :players))
end

这是我在控制台返回的 json:

{id: 26, name: "gol", user_id: 1, players: Array(0)}
id: 26
name: "gol"
players: []
user_id: 1
__proto__: Object

如您所见,玩家数组为空。实际上它不是空的,但在控制台似乎是空的。

我用include(:players) 尝试过类似的操作,但没有成功:

def create
  squad = Squad.create(squad_params)
  render json: squad.include(:players)
end

你知道如何在创建方法中渲染小队 json 包含的玩家吗?

【问题讨论】:

  • squad 创建时是否已经关联了玩家?
  • @SebastianPalma 是的,当然。 Squads has_many: 球员和球员 belongs_to:squad。而且我对创建新小队没有任何问题。我只需要添加一些rails控制器。现在我在控制器上渲染了 json:squad,它运行良好,但我只需要添加类似 json:squad.include(players) 的东西,但我不知道如何使用正确的语法来做到这一点。
  • 是的,我明白了。但是您想从创建动作中返回小队及其所有相关球员,不是吗?如果是这样,当你创建一个新小队时,它是否已经有相关的球员?如果是这样,请尝试使用squad.as_json(include: :players)
  • 我试过这样:def create squad = Squad.create(squad_params) squad.as_json(include: :players) 但甚至没有返回空的数据。它正在与球员一起创建一个新小队,但在创建小队后,我需要在控制台上捕捉球员。如果我说只渲染:squad 返回数据但没有玩家。但也有与小队相关的球员。只是我需要将它们显示为 json。我希望我能清楚地解释自己。
  • 您是有意删除了render json: 部分还是没有将其复制到评论中?在控制台中尝试。

标签: ruby-on-rails json ruby serialization rendering


【解决方案1】:

在rails响应中包含关系的语法是

render json: squad, include: :players

并让小队在创建时有球员

【讨论】:

  • 我试过了,它返回数据但没有播放器。玩家数组返回空,但通常不为空。这太不可思议了,但没有奏效。
  • @ci1991 尝试使用rails c 控制台然后Squad.all 然后选择一些小队以确保其中包含球员或尝试检查数据库之一。
  • 我试过了,是的,小队有球员在 rails c。我认为问题是小队 has_many :players through: :playersquads 也许这就是为什么我不能直接获得球员但我可以在控制台中看到球员数组,它只是返回空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 2017-02-14
相关资源
最近更新 更多