#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