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

#ruby-on-rails #ruby #fastjsonapi

#ruby-on-rails #ruby #fastjsonapi

Вопрос:

У меня есть rails api с несколькими моделями, которые сериализуются драгоценным камнем 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"
    }
  }
}
  

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

Ответ №1:

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

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

Комментарии:

1. Поведение по умолчанию действительно заключается в отображении только идентификатора и типа, однако, согласно их документации, используя хэш параметров со свойством include, я должен получить название команды и цвет команды. Ссылка на документацию: github.com/Netflix/fast_jsonapi#compound-document

2. Я приложил скриншот, чтобы визуализировать его

3. также вы должны использовать options[:include] = [:team, :'team.name', :'team.color'] немного другим способом: options = { include: [:team], fields: { team: [:name, :color] } } Или создать отдельный TeamSerializer и использовать его: options = { include: [:team] } и в ShiftSerializer: belongs_to :team, serializer: TeamSerializer

4. Я следовал тому, что сказано в документации (буквально копировать-вставить), и это не работает. Перейдем к другому способу, о котором вы упомянули. У меня уже есть созданный сериализатор team, который я использую для конечной точки teams. Будет держать вас в курсе. Приветствия!

5. Попробовал и второй подход, и я все еще получаю тот же результат. Я нахожу это довольно странным, поскольку я буквально беру код из документации, которая у них есть

Ответ №2:

Если вы используете 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"

Ответ №3:

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

 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