Как заставить fast_jsonapi возвращать атрибуты отношений

У меня есть API-интерфейс rails с рядом моделей, которые сериализуются с помощью драгоценного камня fast_jsonapi.

Вот так выглядят мои модели:

class Shift < ApplicationRecord
  belongs_to :team, optional: true
  ...
class Team < ApplicationRecord
  has_many :shifts
  ...

Так выглядит сериализатор

class ShiftSerializer
  include FastJsonapi::ObjectSerializer
  ...
  belongs_to :team
  ...
end

Сериализация работает. Однако, несмотря на то, что я включаю составной командный документ:

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

Я все еще получаю объект, отформатированный так:

...
relationships: {
  team: {
    data: {
      id: "22",
      type: "Team"
    }
  }
}

Принимая во внимание, что я ожидаю получить также атрибуты моей модели команды.


person ilrock    schedule 21.04.2019    source источник


Ответы (3)


fast_jsonapi реализует спецификацию json API, поэтому ответ включает ключ "included", в котором размещаются сериализованные данные для отношений. Это поведение по умолчанию.

введите здесь описание изображения

person Yurii    schedule 21.04.2019
comment
Поведение по умолчанию действительно показывает только идентификатор и тип, однако, согласно их документации, используя хэш параметров со свойством include, я должен получить имя команды и цвет команды. Ссылка на документацию: github.com/Netflix/fast_jsonapi#compound-document - person ilrock; 21.04.2019
comment
Я приложил скриншот, чтобы визуализировать его - person Yurii; 21.04.2019
comment
также вы должны использовать options[:include] = [:team, :'team.name', :'team.color'] немного по-другому: options = { include: [:team], fields: { team: [:name, :color] } } Или создать отдельный TeamSerializer и использовать его: options = { include: [:team] } и в ShiftSerializer: belongs_to :team, serializer: TeamSerializer - person Yurii; 21.04.2019
comment
Я следовал тому, что сказано в документации (буквально копировать-вставить), и это не работает. Попробую другой способ, который вы упомянули. У меня уже есть сериализатор команды, который я использую для конечной точки команды. Буду держать вас в курсе. Ваше здоровье! - person ilrock; 21.04.2019
comment
Пробовал и второй подход, и я все еще получаю тот же результат. Я нахожу это довольно странным, поскольку я буквально беру код из документации, которая у них есть. - person ilrock; 21.04.2019
comment
Эй, извините за поздний ответ. Вы разобрались с проблемой? - person Yurii; 24.04.2019

Если вы используете options[:include], вы должны создать сериализатор для включенной модели и настроить то, что включено в ответ.

в вашем случае, если вы используете

ShiftSerializer.new(shifts, include: [:team]).serializable_hash

вам следует создать новый сериализатор serializers/team_serializer.rb

class TeamSerializer
  include FastJsonapi::ObjectSerializer

  attributes :name, :color
end

таким образом, ваш ответ будет

{
  data: [
    {
      id: 1,
      type: "shift",
      relationships: {
        team: {
          data: {
            id: "22",
            type: "Team"
          }
        }
      }
    }
  ],
  included: [
    id: 22,
    type: "Team",
    attributes: {
       name: "example",
       color: "red"
    }
  ]
}

и вы найдете пользовательские данные вашей ассоциации в ответе "included"

person David Metta    schedule 23.01.2020

Если вы используете это, то, возможно, решит вашу проблему

class Shift < ApplicationRecord
    belongs_to :team, optional:true
    accepts_nested_attributes_for :team
end 

В вашем ShiftSerializer.rb напишите этот код,

attribute :team do |object|
    object.team.as_json
end

И вы получите пользовательские данные, которые вы хотите.

Ссылка: https://github.com/Netflix/fast_jsonapi/issues/160#issuecomment-379727174

person nirav kanani    schedule 08.05.2020