使用ember-data,我有两个模型:
App.Post = DS.Model.extend
title: DS.attr "string"
body: DS.attr "string"
categories: DS.hasMany "App.Category"
App.Category = DS.Model.extend
name: DS.attr "string"
posts: DS.hasMany 'App.Post'
和这个序列化:
class PostSerializer < ActiveModel::Serializer
attributes :id, :title, :body
has_many :categories
embed :ids, include: true
end
class CategorySerializer < ActiveModel::Serializer
attributes :id, :name
end
当我要求发帖时,我得到了预期的JSON,我可以毫无问题地访问帖子的类别,但如果我请求类别(我认为它们被缓存),我得到的类别与帖子没有任何关系。它甚至没有尝试发出get请求(这也不起作用)。
那么,不应该让类别的职位关系填满吗?
不确定我是否遗漏了ember或AMS中的内容(我认为类别序列化程序应该知道有很多帖子)
答案 0 :(得分:2)
好吧,在与IRC的一些人挣扎之后,我结束了这个解决方案,我希望这对其他人有所帮助,也许会有所改进。
问题是类别没有任何帖子引用,所以如果你要求帖子,你会得到带有类别的帖子,但类别本身对帖子一无所知。
如果我尝试做类似的事情:
class CategorySerializer < ActiveModel::Serializer
attributes :id, :name
has_many :posts
embed :ids, include: true
end
它会爆炸,因为它们互相引用,你会得到一个“太深层次”或类似的东西。
您可以执行以下操作:
class CategorySerializer < ActiveModel::Serializer
attributes :id, :name
has_many :posts, embed: :objects
end
它会起作用,但结果JSON会很大,因为当你请求发帖时,你会得到每个帖子+每个评论,并且在其中,每个帖子都有这个类别......没有爱
那么这个想法是什么?有类似的东西:
class PostSerializer < ActiveModel::Serializer
attributes :id, :title, :body
has_many :categories
embed :ids, include: true
end
class CategorySerializer < ActiveModel::Serializer
attributes :id, :name
has_many :posts, embed: :ids
end
对于每个帖子,您都会获得categories_ids,并且对于您引用的每个类别,您只能获得属于该类别的帖子的属性和ID(而不是整个对象)。
但是当你去'/#/ categories'并且你没有加载帖子时会发生什么?好吧,既然你的 CategorySerializer 没有序列化任何帖子,你就什么都得不到。
因为你不能在序列化器之间进行交叉引用,所以我最终得到了4个序列化器。 2表示帖子及其类别,2表示类别及其帖子(因此,如果您先加载帖子或类别,则无关紧要):
class PostSerializer < ActiveModel::Serializer
attributes :id, :title, :body
has_many :categories, serializer: CategoriesForPostSerializer
embed :ids, include: true
end
class CategoriesForPostSerializer < ActiveModel::Serializer
attributes :id, :name
has_many :posts, embed: :ids
end
class CategorySerializer < ActiveModel::Serializer
attributes :id, :name
has_many :posts, serializer: PostsForCategorySerializer
embed :ids, include: true
end
class PostsForCategorySerializer < ActiveModel::Serializer
attributes :id, :title, :body
has_many :categories, embed: :ids
end
这就是诀窍。但是因为我是Ember的新手,所以我不是JSON设计的破解者。如果有人知道一个简单的方法或者可能做一些嵌入式(总是或在适配器中加载,我还不明白),请评论:)