【问题标题】:How to deal with many2many objects in EmberJS client?如何处理 EmberJS 客户端中的 many2many 对象?
【发布时间】:2015-08-10 15:19:24
【问题描述】:

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

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

  • 客户
  • 制片人
  • customer2producer

我的 Ember 模型目前如下所示:

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

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

我想这是一种非常常见的情况,我想知道解决问题的最干净的方法是什么。提前致谢。

【问题讨论】:

    标签: ember.js many-to-many


    【解决方案1】:

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

    如果您可以控制后端 API,我只会返回如下响应:

    获取/客户

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

    GET /生产者

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

    您的 REST 后端应该关注对数据库模型进行序列化和反序列化,而不是您的前端应用程序。

    如果您曾经使用过无法立即修改的 API(移动应用程序、第三方等),那么您的 REST API 会随着时间的推移自然而然地与您的后端模型脱节,从而为您提供数据转换工作。所以我真的很想强迫你做对 REST 有意义的事情。

    【讨论】:

    • 这是一个非常好的选择,但我不明白为什么我应该明确选择它而不是在前端管理关系......(除了我缺乏 Ember 经验......编写代码在后端对我来说实际上会更容易)
    • @ikaros45 你仍然需要管理关系。你最终会得到 1 个端点 /customer2producers 另一个模型,它除了在两个方向上保持关系之外什么都不做。或者,如果您的意思是向关系端点发出额外的请求,而没有相应的 ember 模型,那么您最终会在适配器中进行奇怪的覆盖,在该适配器中,您在将数据推送到商店之前侧载关系信息并对其进行跟踪。它只是缓慢、冗长和尴尬。
    • 是的,通过管理关系我的意思是拥有一个 ember 模型 customer2producer... 关键是我已经在我的后端拥有它(默认情况下它在我正在使用的框架中...... .)。我的问题的第一个链接似乎提供了一个解决many2many关系的解决方案,但看起来有点笨拙......
    • @ikaros45 我明白了。它笨重且缓慢,因为它是一个额外的端点来加载数据,将在您获取初始数据后加载(除非您使用嵌入记录,但您已经在进行基本转换,因此您不妨包含关系 ID) ,如果某人需要 100 毫秒绕地球半个地方,那么当它必须按顺序遍历互联网时,您的用户最终将等待 200 毫秒。我会使用这样的中间模型的唯一原因是,如果它上面有数据,那么使用计算属性以便于访问。
    • 这里的速度不是问题,这是针对某种 Intranet 的。但我想我会采用您的方法来节省一些 javascript 头痛......
    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2019-03-04
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多