我在(攀爬)区域的树/层次模型中有一些数据,它们通过父区域和子区域进行关联。
将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规范,只使用默认的序列化程序,这将直接在响应数据中为我提供parent
和children
属性,我可以让这变得更容易。
有没有办法将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
可能是工作!!!