2012-12-06 65 views
4

我正在努力解決一個奇怪的問題。我有一個模型叫Activity像這樣定義的屬性:Ember-data從JSON映射嵌入對象

owner: DS.belongsTo('App.User', embedded: true)

User也是當我得到這樣的JSON響應定義的模型:

some single properties and 

user: { id: etc. } 

我的所有屬性很好的映射,但來自JSON的用戶嵌入對象不會映射到所有者屬性。但是,當我改變

owner 

user 

它很好地映射。但是我想離開老闆,因爲這更能代表我的意思。我試過這個動作:

owner: DS.belongsTo('App.User', key: 'user', embedded: true) 

但它沒有幫助。

+0

你能解釋一下你的意思是當你說「它很好地映射」或「它並沒有很好地」?也許你可以設置一個JSFiddle的例子? –

+0

你有沒有想過這個?我有同樣的問題。 –

回答

1

首先,我推薦使用最新的Ember/EmberData,但您需要手動處理嵌入記錄enhancing extractSingle in a custom serializer(請參閱下面的示例)。此外,你應該這樣定義關係:

App.Activity = DS.Model.extend({ 
    name: DS.attr('string'), 
    owner: DS.belongsTo('user') 
}); 

App.User = DS.Model.extend({ 
    name:  DS.attr('string'), 
    activities: DS.hasMany('activity') 
}); 

接下來,我建議使用ActiveModelAdapter如果您使用下劃線與服務器進行通信時(即像EmberData 0.13):

App.ApplicationAdapter = DS.ActiveModelAdapter; 

最後,要將owner用於User,請在自定義序列化器中覆蓋typeForRoot

例如:

App.ApplicationSerializer = DS.ActiveModelSerializer.extend({ 
    typeForRoot: function(root) { 
    if (root == 'owner' || root == 'owners') { root = 'user'; } 
    return this._super(root); 
    }, 

    // based on: https://github.com/emberjs/data/blob/master/TRANSITION.md#embedded-records 
    extractSingle: function(store, type, payload, id, requestType) { 
    var owner = payload.activity.owner, 
     ownerId = owner.id; 

    payload.owners = [owner]; 
    payload.activity.owner_id = ownerId; 

    return this._super.apply(this, arguments); 
    } 
}); 

Example JSBin