Ember 2 简单的多态关系

Posted

技术标签:

【中文标题】Ember 2 简单的多态关系【英文标题】:Ember 2 simple polymorphic relations 【发布时间】:2016-05-04 19:10:07 【问题描述】:

我有一个笔记模型,我想将它附加到其他两个模型(客户和供应商)之一。

在我的数据库中,我有一个 foreignTypeforeignId 字段,其中包含客户或供应商的类型和相应 ID,例如

notes:  id: 1, body:'bar',foreignType:'customer',foreignId:100,
         id: 2, body:'foo',foreignType:'supplier',foreignId:100
       

也就是说,可以为客户或供应商附加注释。

约定似乎是该字段被称为noteType? 我见过tutorial,其中相关类型嵌套在 JSON 中,而不是位于根目录中。

我的 ember 模型如下所示:

//pods/note/model.js
  export default DS.Model.extend(
    //...
    body: DS.attr('string'),
    foreign: DS.belongsTo('noteable',polymorphic:true)
  );

//pods/noteable/model.js (is there a better/conventional place to put this file?)
  export default DS.Model.extend(
    notes: DS.hasMany('note')
  );

//pods/customer/model.js
  import Noteable from '../noteable/model'; 

  export default Noteable.extend( //derived from Noteable class
     name: DS.attr('string'),
     //...
   );

//pods/supplier/model.js
  // similar to customer



// sample incoming JSON
//
"customer":"id":2,"name":"Foobar INC",...,
 "contacts":  
    ["id":1757,"foreignType": "customer","foreignId":2,...,
     "id":1753,"foreignType": "customer","foreignId":2,...,
     ...],
   ...
  "todos":
     ["id":1,"foreignType":"customer","foreignId":2,"description":"test todo"],
  "notes":
     ["id":1,"foreignType":"customer","foreignId":2,"body":"Some customer note "]

如何正确设置,即 Ember 期望什么?

我的笔记没有正确附加到客户模型上。它们显示在 Ember Inspector 的“数据”选项卡中,但任何客户的备注列表都是空的。

我可以看到几种可能性:

DS.Model 扩展客户/供应商并拥有属性 notes: belongsTo('noteable'),这意味着注释中的 belongsTo 不是多态的,因为不会有任何派生类, 只有 值得注意 本身。不确定 ember(数据)是否可以正确处理这种嵌套。

值得注意的扩展。如果我想要其他可以与客户或供应商相关的信息,例如地址或联系人,该怎么办?

创建重复模型,例如 customernote/suppliernote、customercontact/suppliercontact、customer/supplier/employee address。并让后端根据端点返回过滤后的表/模型名称。不过我不喜欢重复自己......

余烬:2.2.0 灰烬数据:2.2.1

【问题讨论】:

【参考方案1】:

我喜欢 Ember 文档在这里解释多态性的方式 - https://guides.emberjs.com/v2.13.0/models/relationships/#toc_polymorphism

所以,首先你需要有一个“类型”来定义要使用的模型(你的数据称之为foreignType)

接下来,您的票据模型将是多态模型(类似于上面示例中的 paymentMethod 模型)。如果您需要更多说明,请在评论中告诉我,但我认为如果您按照给定的示例进行操作,就会非常清楚。

【讨论】:

以上是关于Ember 2 简单的多态关系的主要内容,如果未能解决你的问题,请参考以下文章

Mirage 的简单 Ember 数据问题(错误:遇到未定义类型的资源对象)

Java面向对象多态的详细介绍,简单易懂,看这一篇就够了

ember简单auth用rails设计用户名而不是电子邮件?

继承和多态

Ember:关系链接相关数据未加载/消失

Ember 数据保存关系