从JSON API响应中解析包含的关联 - Rails API,AMS,Vue.js SPA

时间:2017-01-18 19:40:05

标签: javascript ruby-on-rails json vue.js active-model-serializers

我有一些数据在树木/层级模型中用于(攀爬)区域,以便它们通过父母和儿童区域相关联。

将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

并准确返回所期望的内容:具有Area数据的JSON响应,标识user_id / type的关系对象,parent_id / type,children_id / type。这些都被发送到Vuex商店中的Vue SPA变异。

问题是所有内容都在响应的included成员中混淆了。我最终想要轻松访问parent "slug"并分别存储children数组。

是的,响应中有子节点和父节点,但它们都是相同的type: "areas",并且一起存在于一个数组中。必须有一些合理的方法来解析javascript中的这些数据,以便我可以将响应的parent: data { id: "5" }成员中的relationshipsid之一的included进行比较数组成员

我知道如果我删除JSON API规范并且只使用默认的序列化程序,我可以使这更容易,这将直接在响应数据中提供parentchildren属性。

有没有办法将javascript中的这些相关对象解析为自己明确定义的数组/对象?也许我应该删除这个的JSON API规范,直接从服务器控制我的数据输出?

我希望这是有道理的;有人必须先遇到这种情况,但我找不到任何例子......

2 个答案:

答案 0 :(得分:0)

您可以手动解析响应对象:

// 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

答案 1 :(得分:0)

首先,您应该修复序列化程序

您的关系has_many :children是错误的,您应该使用has many :childrens修复它

因为你有很多孩子而不是孩子!!

您可以更改包含关系和更改显示定义的时间

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

可能是可行的!!