我在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, 马丁
(注意:与我实际建模的有趣域相比,模型名称是虚构的,使它们更易于理解)
答案 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响应中。