嵌套数据的自反关系

时间:2018-09-11 07:58:49

标签: ember.js ember-data

对于这是一个基本问题,我们深感抱歉,但是由于我还很陌生,所以我想知道这种情况下是否有最佳实践。例如,我有以下端点,它们返回下面的有效负载:

https://api.example.com/v1/user

[
    {
        "user": "user1",
        "firstName": "Foo1",
        "lastName": "Bar1",
        "url": "https://api.example.com/v1/user/user1"
    },
    {
        "user": "user2",
        "firstName": "Foo2",
        "lastName": "Bar2",
        "url": "https://api.example.com/v1/user/user2"
    }
]

每个“ url”端点都返回如下内容:

https://api.example.com/v1/user/user1

{
    "user": "user1",
    "firstName": "Foo1",
    "lastName": "Bar1",
    "age": 21,
    "address": "User1 Address"
    ... more info ...
}

我们看到"/user"中的某些属性在"/user/user1"中重复了。

创建"user"模型的最佳实践是什么?

我应该有两个模型吗?例如,例如"users"的{​​{1}}模型和"/user"的{​​{1}}模型?

以某种方式可以同时满足两个端点的模型"user"吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

这几乎是用例described in the one-to-one docs,您将在其中用一个模型定义用户数据,然后将另一个模型与belongsTo属性链接起来:

// app/models/user.js
import DS from 'ember-data';

export default DS.Model.extend({
  user: DS.attr('string'),
  firstName: DS.attr('string'),
  lastName: DS.attr('string'),
  url: DS.attr('string'),

  profile: DS.belongsTo('profile')
});

然后使用您想要添加的任何其他值来建立配置文件模型,并同时定义EmiratesTo属性:

// app/models/profile.js
import DS from 'ember-data';

export default DS.Model.extend({
  age: DS.attr('string'),
  address: DS.attr('string'),

  user: DS.belongsTo('user')
});

在路由文件中,您需要设置用户ID来定义您的URL结构,如下所示:

//app/router.js
Router.map(function() {
  this.route('users');
  this.route('user', { path: '/user/:user_id' });
});

最后,您需要加载数据retrieving the related records并通过路由文件将其加载。

// app/routes/user.js
import Route from '@ember/routing/route';

export default Route.extend({
  model(params) {
   return this.store.findRecord('user', params.user_id, {include: 'profile'});
  }
});

值得指出的是,您也可以need a serializer将数据整理成所需的格式。