1

使用 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,我可以毫无问题地访问帖子的类别,但是如果我请求类别(我认为它们被缓存),我得到的类别与帖子没有任何关系。它甚至不会尝试发出获取请求(这也不起作用)。

那么,类别不应该填满他们的帖子关系吗?

不确定我是否错过了 ember 或 AMS 中的某些内容(我认为类别序列化程序应该知道有很多帖子)

4

1 回答 1

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

于 2013-04-29T22:33:02.293 回答