1

我在 hasMany 链中有 3 个模型。EG Gallery -> 图片 -> 评论

在单个 json 响应中返回选定的图库和其中的图像按预期工作。后端是一个使用 active_model_serializers 的 Rails 应用程序,顺便说一句。

{"images":[...],"galleries":{"id":1,...,"images":[1,2,3]}}

但是当我告诉序列化程序关于 Comments 并且它们被包含在 json 中时,我从 Ember 中得到一个映射错误。

{"comments":[...],"images":[...],"galleries":{"id":1,...,"images":[1,2,3]}}

错误:断言失败:您的服务器返回了一个带有关键注释的哈希,但您没有它的映射

我不知道如何正确地告诉 Ember 如何处理这个问题。我的调试表明 json 响应中的任何内容都必须在 Gallery 模型中直接引用。为了确定,我尝试使用单数和复数形式向 RESTAdapter 添加“映射”。“comments:App.Comment”或“comment:App.Comment”我看不出有什么区别。

我想我可以放弃并再做一些请求,但是由于在使用给定图像时总是使用评论,所以感觉不对。我希望得到一些帮助来确定我们如何在单个响应中允许数据。

我是否需要完全重新配置序列化程序和 Ember 以嵌入数据而不是使用 ID 引用它们?

雪儿,马丁

(注意:模型名称是虚构的,与我实际建模的有趣领域相比,它们更易于理解)

4

1 回答 1

2

谢谢你促使我回到这个话题。

这是我目前所拥有的。我不知道在最近对 Ember 和 Ember Data 的更新中是否可以删除其中的任何内容。

商店指定:

DS.RESTAdapter.configure("plurals", {
  image: 'images',
  gallery: 'galleries',
  comment: 'comments'
});
DS.RESTAdapter.configure('App.Image', {
  sideloadAs: 'images'
});
DS.RESTAdapter.configure('App.Comment', {
  sideloadAs: 'comments'
});
App.store = DS.Store.create({
  revision: 11,
  adapter: DS.RESTAdapter.create({
    mappings: {
      comments: 'App.Comment'
    }
  })
});

如果您的数据是像图像和事物这样的普通单词,我相当确定您不需要复数定义。我的领域在概念上接近这些,但更具技术性。我选择使用这些名称发布,以使概念和关系更容易理解。

我的模型包含以下......以及所有其他常见的东西。

App.Gallery = DS.Model.extend({
  images: DS.hasMany('App.Image',{key: 'images', embbeded: true})
});

App.Image = DS.Model.extend({
  comments: DS.hasMany('App.Comment',{key: 'comments', embedded: true}),
  gallery: DS.belongsTo('App.Gallery')
});

App.Comment = DS.Model.extend({
  image: DS.belongsTo('App.Image')
});

这允许我返回一个 json 结构,就像我的问题中的那个:

{"comments":[...],"images":[...],"galleries":{"id":1,...,"images":[1,2,3]}}

这是使用 ActiveModelSerializers 从 Rails 生成的。我的序列化程序如下所示:

class ApplicationSerializer < ActiveModel::Serializer
  embed :ids, :include => true
end
class GallerySerializer < ApplicationSerializer
  attributes :id, ...
  root "gallery"
  has_many :images, key: :images, root: :images
end
class ImageSerializer < ApplicationSerializer
  attributes  :id, ...
  root "image"
  has_many :comments, key: :comments, root: :comments
end
class CommentSerializer < ApplicationSerializer
  attributes  :id, ...
end

再次。我认为你可以不那么冗长。我的 Rails 模型并不简单,称为“Gallery”。它们以“BlogGallery”之类的名称分隔,但我不希望 Ember 必须处理所有这些。出于这个原因,我需要关键根本的东西。

我认为这涵盖了我所有关于关联并将它们嵌入到相同的 json 响应中。

于 2013-02-18T12:27:33.063 回答