Tim*_*nen 4 ember.js ember-data
我的服务器返回一个JSON响应,如下所示:
{
artists: [{
id: "1",
first_name: "Foo",
last_name: "Bar"
}],
studios: [{
id: 1,
name: "Test",
// ...
artist_ids: ["1"]
}]
}
Run Code Online (Sandbox Code Playgroud)
"艺术家"实际上是一个用户模型,但名称不同.如何将艺术家映射到用户模型?也许是一个糟糕的解释,但如果我将JSON响应服务器重命名为"用户"而不是"艺术家",并使用下面的模型,一切都像我想要的那样.我只想在服务器端和客户端使用名称"artist"而不是"user".希望你们明白我的意思.
App.Studio = DS.Model.extend
name: DS.attr 'string'
// ..
users: DS.hasMany 'App.User'
App.User = DS.Model.extend
firstName: DS.attr 'string'
lastName: DS.attr 'string'
studio: DS.belongsTo 'App.Studio'
Run Code Online (Sandbox Code Playgroud)
我想最简单的事情就是艺术家:DS.hasMany'App.User',但显然这不起作用.
首先,我建议使用最新的Ember/EmberData,因此关系定义如下:
App.Studio = DS.Model.extend({
name: DS.attr('string'),
// ..
users: DS.hasMany('user')
});
App.User = DS.Model.extend({
firstName: DS.attr('string'),
lastName: DS.attr('string'),
studio: DS.belongsTo('studio')
});
Run Code Online (Sandbox Code Playgroud)
接下来,ActiveModelAdapter如果您在响应JSON中获得下划线,我建议使用:
App.ApplicationAdapter = DS.ActiveModelAdapter;
Run Code Online (Sandbox Code Playgroud)
最后,覆盖typeForRoot并keyForRelationship在自定义序列应该解决您的问题:
App.ApplicationSerializer = DS.ActiveModelSerializer.extend({
typeForRoot: function(root) {
if (root == 'artist' || root == 'artists') { root = 'user'; }
return this._super(root);
},
keyForRelationship: function(key, kind) {
if (key == 'users') { key = 'artists'; }
return this._super(key, kind);
}
});
Run Code Online (Sandbox Code Playgroud)
最后一件事:keyForRelationship如果您artists在Studio以下位置命名关系,您甚至可以摆脱自定义:
App.Studio = DS.Model.extend({
name: DS.attr('string'),
// ..
artists: DS.hasMany('user')
});
Run Code Online (Sandbox Code Playgroud)