我有一个具有多对多关系的数据模型。假设我有一个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定义customers
和producers
数组。问题是,我迟早会切换到真正的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有意义的事情。