Рефлексивная связь с вложенными данными - PullRequest
0 голосов
/ 11 сентября 2018

Извините, если это основной вопрос, но, поскольку я довольно новичок в ember, я хотел бы знать, есть ли лучшая практика для такого случая. Например, у меня есть следующие конечные точки, которые возвращают полезные данные ниже:

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" для "/user" и модель "user" для "/user/user1"?

Может ли быть как-то только одна модель "user", которая бы подходила обеим конечным точкам?

Заранее спасибо!

1 Ответ

0 голосов
/ 13 сентября 2018

Это почти случай использования , описанный в документах "один к одному" , где вы определяете пользовательские данные с помощью одной модели и связываете другую модель с атрибутом ownTo:

// 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')
});

Затем настройте модель профиля с любыми дополнительными значениями, которые вы хотите добавить, и определите также атрибут ownTo:

// 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')
});

В вашем файле маршрутов вы захотите настроить идентификатор пользователя для определения вашей структуры URL следующим образом:

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

Затем, наконец, вам нужно загрузить данные , получив соответствующие записи и загрузив их через файл маршрута.

// 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'});
  }
});

Стоит отметить, что вам также может нужен сериализатор , чтобы преобразовать данные в нужный вам формат.

...