如何在多2个关联上填写相关模型?

时间:2013-04-29 18:32:43

标签: ember.js many-to-many ember-data active-model-serializers

使用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中的内容(我认为类别序列化程序应该知道有很多帖子)

1 个答案:

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