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



我在(攀爬)区域的树/层次模型中有一些数据,它们通过父区域和子区域进行关联。

将JSON API适配器与我的活动模型序列化程序一起使用

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的关系对象。这一切都被发送到Vue SPA的Vuex商店中的一个突变中。

问题是所有内容都混合在响应的included成员中。我最终希望能够方便地访问parent "slug"并单独存储一个children数组。

是的,响应中有子级和父级,但它们都是同一个type: "areas",并且都在一个数组中。必须有一些合理的方法来用javascript解析这些数据,这样我就可以将响应的relationships成员中的parent: data { id: "5" }与其中一个included数组成员的id进行比较

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

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

我希望这是有道理的;肯定有人以前遇到过这种情况,但我找不到任何例子。。。

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

// 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套件:https://jsonapi-suite.github.io/jsonapi_suite/js/home

首先应该修复序列化程序

你的关系has_many :children你应该用has many :childrens来修复它

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

其次,您可以更改包含关系并更改节目定义

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

可能是工作!!!

最新更新