如何处理EmberJS客户端中的许多对象



我有一个具有多对多关系的数据模型。假设我有一个Producer模型和一个Customer模块。一个顾客可以从任意数量的生产者那里购买,而一个生产者可以为任意数量的顾客服务。

在后端,我有三个表的标准关系配置:

    客户
  • customer2producer

我的余烬模型现在是这样的:

// models/producer.js
import DS from 'ember-data';
export default DS.Model.extend({
  customers: DS.hasMany('module'),
});
// models/customer.js
import DS from 'ember-data';
export default DS.Model.extend({
  producers: DS.hasMany('module'),
});

现在我正在使用fixture,我所做的就是用"目标"的id定义customersproducers数组。问题是,我迟早会切换到真正的REST后端,这意味着我必须处理模型不匹配的问题。我想我必须选择:

  • 定义一个烬模型customer2producer。这可能会起作用,但我想我将不得不写很多样板,最有可能的关系将无法从模型访问(customer.get('producers')不会直接工作,我可能不得不玩,并在这个问题上做一些事情:

    与Ember, Ember -data和Rails的多对多关系

  • Hook到序列化/反序列化系统,并将后端customer2producer对象转换为Ember模型引用。我不完全确定这是可能的,但我想说的是,从快速阅读这些问题:

    如何在Ember.js中保存多对多关系的模型?

    保存嵌套模型

我想这是一个很常见的情况,我想知道什么是最干净的方法来解决这个问题。

您的数据库不需要映射到您的REST API。特别是您没有平面数据的限制(现在在某些数据库中也没有)。

如果你控制你的后端API,我只会返回这样的响应:

GET/客户

{
  customers: [
    {id: 1, producers: [1, 2]},
    {id: 2, producers: []},
  ]
}

GET/生产商

{
  producers: [
    {id: 1, customers: [1]},
    {id: 2, customers: [1]}
  ]
}

你的REST后端应该关心对数据库模型的序列化和反序列化,而不是你的前端应用。

如果你曾经有一些你不能立即修改的API(移动应用程序,第三方等),你的REST API自然会随着时间的推移与你的后端模型脱节,给你数据转换工作。所以我真的希望你只做对REST有意义的事情。

最新更新