2013-11-07 4 views
0

Я пытаюсь загрузить родительскую запись, содержащую две записи hasMany. Вот мои модели (я использую уголек-приложение-кит, кстати с последней канарейкой от уголька и Ember-данных):hasMany Данные не загружаются

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; 

Вот это JSON, который возвращается из моего экземпляра MongoDB:

{ 
    "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": "[email protected]", 
     "id": "5277ca37b900b14c0e000003" 
     } 
    ] 
    } 
} 

Вот мой маршрут сериализатор:

import ApplicationSerializer from 'appkit/serializers/application'; 

var RouteSerializer = ApplicationSerializer.extend({ 
    attrs: { 
     routeUsers: { 
      embedded: 'always' 
     }, 
     userApprovals: { 
      embedded: 'always' 
     } 
    } 
}); 

export default RouteSerializer; 

Я делаю нормализации в сериализаторе приложения для _id именно поэтому я простирающийся мой маршрут сериалайзер отходящим от него. Это единственное изменение в моем сериализаторе приложений.

Проблема, с которой я сталкиваюсь, заключается в том, что когда моя модель маршрута загружается и устанавливается в моем контроллере, ни одно из отношений hasMany не существует. Когда я смотрю на свою модели с помощью расширения уголька хрома и консоли это выглядит следующим образом:

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 загруженным, только ид.

Я искал последнюю пару дней и получил указал на этом PR:

https://github.com/emberjs/data/pull/1404

Но я до сих пор не могу заставить его работать. Я уверен, что мне что-то не хватает, просто, наверное, нужны другие глаза.

Спасибо, Jarred

ответ

0

Я был в состоянии решить мою проблему, полностью отходя от Ember-данных на некоторое время. Вместо этого я применил модель ember, которая хорошо работает из-за моей ситуации. Я использую mongodb и множество встроенных записей. Я знаю, что это не полностью отвечает на вопрос, но мне нужно закрыть его, так как мне больше не нужен ответ на мой оригинальный вопрос из-за перехода на ember-model.

Если вы столкнулись с той же проблемой с данными ember и хотите узнать о моей настройке, пришлите мне сообщение.

-Jarred

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); 
    } 
}); 
Смежные вопросы