我有一些数据在树木/层级模型中用于(攀爬)区域,以便它们通过父母和儿童区域相关联。
将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" }
成员中的relationships
与id
之一的included
进行比较数组成员
我知道如果我删除JSON API规范并且只使用默认的序列化程序,我可以使这更容易,这将直接在响应数据中提供parent
和children
属性。
有没有办法将javascript中的这些相关对象解析为自己明确定义的数组/对象?也许我应该删除这个的JSON API规范,直接从服务器控制我的数据输出?
我希望这是有道理的;有人必须先遇到这种情况,但我找不到任何例子......
答案 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
可能是可行的!!