好吧,在与 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 设计的专家。如果有人知道一种简单的方法或者可能做一些嵌入式(总是或加载到适配器中,我还不明白),请评论:)