Анализ включенных ассоциаций из ответа JSON API — Rails API, AMS, Vue.js SPA

У меня есть некоторые данные в древовидной/иерархической модели для (восхождения) областей, так что они связаны через родительские и дочерние области.

Используя адаптер JSON API с моим Active Model Serializer,

class AreaSerializer < ActiveModel::Serializer
  attributes :id, :name, :description, :location, :slug
  belongs_to :user
  belongs_to :parent
  has_many :children
end

Я могу вернуть область с родителем и дочерними элементами, включенными в мой контроллер:

class AreasController < ApplicationController

  ...

  def show
    area = Area.friendly.find(params[:id])
    render json: area, include: [:children, :parent]
  end
end

и вернуть именно то, что ожидалось: ответ JSON с данными Area, объект отношений, который идентифицирует user_id/type, parent_id/type, children_id/type. Все это отправляется на мутацию в хранилище Vuex для Vue SPA.

Проблема в том, что в included элементе ответа все перепутано. В конечном итоге я хочу легко получить доступ к parent "slug" и хранить массив children отдельно.

Да, в ответе есть дочерние и родительские элементы, но все они одного и того же type: "areas" и все вместе в одном массиве. Должен быть какой-то разумный способ проанализировать эти данные в javascript, чтобы я мог сравнить parent: data { id: "5" } в элементе relationships ответа с id одного из элементов массива included

Я понимаю, что могу сделать это проще, если откажусь от спецификации JSON API и просто использую сериализатор по умолчанию, который даст мне атрибуты parent и children непосредственно в данных ответа.

Есть ли способ разобрать эти связанные объекты в javascript на четко определенные собственные массивы/объекты? Может быть, мне следует отказаться от спецификаций JSON API для этого и просто контролировать вывод данных непосредственно с сервера?

Надеюсь это имеет смысл; кто-то, должно быть, сталкивался с этим раньше, но я не мог найти никаких примеров...


person C. Norwood    schedule 18.01.2017    source источник


Ответы (2)


Вы можете разобрать объект ответа вручную:

// User response from server:

const user = {
  "id": "1",
  "type": "users",
  "attributes": {
    "name": "John Doe"
  },
  "included": [
    {
      "id": "2",
      "type": "roles",
      "attributes": {
        "name": "Admin"
      }
    }
  ]
};

// Manually parsing a User response object:
user.id; // 1
user.attributes.name; // John Doe
user.included.filter(obj => obj.type === 'roles')[0].attributes.name; // Admin

Или вы можете использовать JSONAPI Suite: https://jsonapi-suite.github.io/jsonapi_suite/js/home

person plcosta    schedule 13.12.2018

сначала вы должны исправить свой сериализатор

ваше отношение has_many :children неправильно, вы должны исправить это с помощью has many :childrens

потому что у тебя много детей не детей!!!

во-вторых, вы можете изменить отношения включения и изменить определение отображения

def show
  area = Area.friendly.find(params[:id])
  render jsonapi: area, include: %w(childrens, parent)
end

наверное это работа!!!

person kia    schedule 09.12.2019