如何避免缺少2级深层关联的映射?

时间:2012-10-23 09:17:20

标签: ember.js ember-data

我在hasMany链中有3个模型。 例如。图库 - >图像 - >评论

在单个json响应中返回选定的Gallery和其中的Images按预期工作。后端是一个使用active_model_serializers,btw。

的Rails应用程序
{"images":[...],"galleries":{"id":1,...,"images":[1,2,3]}}

但是当我告诉序列化程序有关注释并将它们包含在json中时,我从Ember得到了一个映射错误。

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

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

我无法弄清楚如何正确告诉Ember如何处理这个问题。我的调试表明,json响应中的任何内容都必须在Gallery模型中直接引用。我尝试使用单数和复数形式向RESTAdapter添加“映射”以确保。 “评论:App.Comment”或“评论:App.Comment”没有任何区别,我可以看到。

我想我可以放弃,只是再做几个请求,但由于在使用给定的图像时总是使用注释,所以感觉不对。我希望能帮助我们了解如何在一次响应中使用数据。

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

chers, 马丁

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

1 个答案:

答案 0 :(得分: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必须处理所有这些。出于这个原因,我需要 root

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