4

我的服务器返回如下 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.hasMany 'App.User'但显然这不起作用。

4

2 回答 2

6

首先,我推荐使用最新的 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;

最后,覆盖typeForRootkeyForRelationship在自定义序列化程序中应该可以解决您的问题:

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

keyForRelationship最后一件事:如果您将关系命名为,您甚至可以摆脱自artists定义Studio

App.Studio = DS.Model.extend({
  name:  DS.attr('string'),
  // ..
  artists: DS.hasMany('user')
});
于 2013-09-29T19:56:18.807 回答
3

您是否尝试过创建从 User 扩展的 Artist 模型?

App.Artist = App.User.extend({})

我还没有尝试过,但我怀疑这可能会奏效。

于 2013-09-29T19:37:09.023 回答