我的服务器返回如下的JSON响应:
{
artists: [{
id: "1",
first_name: "Foo",
last_name: "Bar"
}],
studios: [{
id: 1,
name: "Test",
// ...
artist_ids: ["1"]
}]
}
"艺术家"实际上是一个用户模型,但名称不同。如何将艺术家映射到用户模型?也许是一个糟糕的解释,但是如果我将JSON响应服务器端重命名为"用户"而不是"艺术家"并使用下面的模型,那么一切都像我想要的那样工作。我只想使用名称"艺术家"而不是"用户",无论是服务器端还是客户端。希望你们明白我的意思。
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'
我想最简单的事情是像艺术家一样:DS.has许多"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')
});
接下来,如果您ActiveModelAdapter
响应 JSON 中获得下划线,我建议使用 :
App.ApplicationAdapter = DS.ActiveModelAdapter;
最后,重写自定义序列化程序中的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);
}
});
示例 JSBin
最后一件事:如果您将关系命名为artists
,您甚至可以摆脱自定义keyForRelationship
Studio
:
App.Studio = DS.Model.extend({
name: DS.attr('string'),
// ..
artists: DS.hasMany('user')
});
您是否尝试过仅创建从用户扩展的艺术家模型?
App.Artist = App.User.extend({})
我还没有尝试过,但我怀疑这可能会起作用。