如何获取fast_jsonapi返回关系的属性

ilr*_*ock 5 ruby ruby-on-rails fastjsonapi

我有一个带有由fast_jsonapi gem序列化的模型的Rails api。

我的模型如下所示:

class Shift < ApplicationRecord
  belongs_to :team, optional: true
  ...
Run Code Online (Sandbox Code Playgroud)
class Team < ApplicationRecord
  has_many :shifts
  ...
Run Code Online (Sandbox Code Playgroud)

这就是序列化器的样子

class ShiftSerializer
  include FastJsonapi::ObjectSerializer
  ...
  belongs_to :team
  ...
end
Run Code Online (Sandbox Code Playgroud)

序列化工作。但是,即使我包含复合团队文档:

def index
  shifts = policy_scope(Shift).includes(:team)
  options = {}
  options[:include] = [:team, :'team.name', :'team.color']
  render json: ShiftSerializer.new(shifts, options)
end
Run Code Online (Sandbox Code Playgroud)

我仍在像这样格式化对象:

...
relationships: {
  team: {
    data: {
      id: "22",
      type: "Team"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

而我期望也能获得团队模型的属性。

Yur*_*rii 4

fast_jsonapi 实现json api 规范,因此响应包含“包含”键,其中放置了关系的序列化数据。这是默认行为

在此输入图像描述

  • 默认行为确实是只显示 id 和类型,但是,根据他们的文档,通过使用包含属性的选项哈希,我应该获得团队名称和团队颜色。文档链接:https://github.com/Netflix/fast_jsonapi#compound-document (2认同)
  • 您还应该以其他方式使用 `options[:include] = [:team, :'team.name', :'team.color']`: `options = { include: [:team], fields: { team: [:name, :color] } }` 或者创建单独的 TeamSerializer 并使用它: `options = { include: [:team] }` 并在 ShiftSerializer 中: `belongs_to :team, serializer: TeamSerializer` (2认同)