我正在尝试加载包含两个hasMany子记录的父记录。这是我的模型(我使用ember-app-kit和最新的ember和ember数据):
var Route = DS.Model.extend({
name: DS.attr(),
description: DS.attr(),
creation: DS.attr(),
modified: DS.attr(),
active: DS.attr(),
adhoc: DS.attr(),
routeUsers: DS.hasMany('user'),
userApprovals: DS.hasMany('userApproval')
});
export default Route;
var UserApproval = DS.Model.extend({
user: DS.belongsTo('user'),
amount: DS.attr(),
approval: DS.attr(),
comment: DS.attr(),
denyRedirect: DS.belongsTo('user')
});
export default UserApproval;
var User = DS.Model.extend({
firstname: DS.attr(),
lastname: DS.attr(),
username: DS.attr(),
email: DS.attr(),
fullName: function(){
return this.get('firstname') + ' ' + this.get('lastname');
}.property('firstname', 'lastname')
});
export default User;
这是从我的mongodb实例返回的JSON:
{
"route": {
"name": "4",
"description": "123",
"adhoc": true,
"_id": "527822dee56a06dc2a000002",
"__v": 0,
"user_approvals": [
{
"amount": "22",
"user_id": "5277ca37b900b14c0e000003",
"deny_redirect_id": "5277ca25b900b14c0e000002",
"id": "f0ced142-aee1-4abb-f36a-56ae0088141b"
}
],
"route_users": [
{
"firstname": "first",
"lastname": "last",
"username": "flast",
"email": "flast@xyz.com",
"id": "5277ca37b900b14c0e000003"
}
]
}
}
这是我的路由序列化器:
import ApplicationSerializer from 'appkit/serializers/application';
var RouteSerializer = ApplicationSerializer.extend({
attrs: {
routeUsers: {
embedded: 'always'
},
userApprovals: {
embedded: 'always'
}
}
});
export default RouteSerializer;
我在_id的应用程序序列化程序中进行了规范化,这就是我将路由序列化程序从它扩展的原因。这是我的应用程序序列化程序中唯一的变化。
我遇到的问题是当我的路由模型被加载并在我的控制器中设置时,没有任何hasMany关系存在。当我使用ember chrome扩展和控制台查看我的模型时,它看起来像这样:
adhoc: true
description: "something here"
id: "527948268a65b92022000001"
name: "14"
routeUserIds: Array[1]
0: "5277ca25b900b14c0e000002"
length: 1
__proto__: Array[0]
routeUsers: undefined
userApprovalIds: Array[1]
0: "017b4fe7-9f98-4bce-9c8d-089309b7729a"
length: 1
__proto__: Array[0]
userApprovals: undefined
v: 0
__proto__: Object
所以我知道我的路线被放置在模型中,我可以渲染诸如名称和描述之类的东西,但我的hasMany关系没有任何东西。我怎样才能访问我的hasMany关系?我可以查看商店,看看在交付有效载荷后我的hasMany关系被加载到商店。我试过用这个来覆盖extractSingle:
extractSingle: function(store, type, payload, id, requestType) {
var userApprovals = payload.route.user_approvals,
approvalIds = userApprovals.mapProperty('id');
payload.user_approvals = userApprovals;
payload.route.user_approvals = approvalIds;
return this._super.apply(this, arguments);
}
但它渲染的结果与之前完全相同,没有加载任何hasMany信息,只有ids。
过去几天我一直在寻找并指出这个PR:
https://github.com/emberjs/data/pull/1404
但我仍然无法让它发挥作用。我确定我错过了一些东西,可能还需要一些其他的眼睛来看。
谢谢, 震动
答案 0 :(得分:0)
我能够通过彻底摆脱余烬数据来解决我的问题。我改为实现了ember-model,它可以很好地开箱即用。我正在使用mongodb和许多嵌入式记录。我知道这并没有完全回答这个问题,但我需要关闭它,因为我不再需要回答我原来的问题,因为转向了ember-model。
如果您遇到与ember-data相同的问题并想了解我的设置,请给我发消息。
-Jarred
答案 1 :(得分:0)
首先,attrs
是旧密钥到新密钥的直接字符串到字符串映射,因此您当前的使用无效。
在TRANSITION.md文档中详细解释了这种情况,我在下面引用:
{
"post": {
"id": "1",
"title": "Rails is omakase",
"comments": [{
"id": "1",
"body": "I like omakase"
}, {
"id": "2",
"body": "I prefer not to rely on elitist chefs"
}]
}
}
您可以像这样处理嵌入式记录:
App.PostSerializer = DS.RESTSerializer.extend({
extractSingle: function(store, type, payload, id, requestType) {
var comments = payload.post.comments,
commentIds = comments.mapProperty('id');
payload.comments = comments;
payload.post.comments = commentIds;
return this._super.apply(this, arguments);
}
});