Ember 2简单的多态关系

时间:2016-01-27 17:24:46

标签: ember.js polymorphism

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

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

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

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

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

我的余烬模型看起来像这样:

//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的Data选项卡中,但任何客户的备注列表都是空的。

我可以看到几种可能性:

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

  • Noteable 延伸。如果我想拥有与客户或供应商相关的地址或联系人等其他内容,该怎么办?

  • 创建重复的模型,如customernote / suppliernote,customercontact / suppliercontact,客户/供应商/员工地址。并让后端根据端点返回过滤的表/模型名称。我不想重复自己......

Ember:2.2.0
Ember数据:2.2.1

1 个答案:

答案 0 :(得分:0)

我喜欢Ember doc如何解释多态性 - https://guides.emberjs.com/v2.13.0/models/relationships/#toc_polymorphism

所以,首先你需要一个'类型'这将定义要使用的模型(您的数据称为foreignType)

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