2016-01-27 3 views
4

У меня есть модель заметок, которую я хочу прикрепить к одной из двух других моделей, клиентов и поставщиков.Ember 2 простых полиморфных отношения

В моей базе данных у меня есть foreignType и ForeignID поля, которое содержит тип и соответствующий идентификатор для клиента или поставщика, что-то вроде

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, но список заметок любого клиента пуст.

Я вижу несколько возможностей:

  • расширить клиент/поставщик от DS.Model и имеет свойство notes: belongsTo('noteable'), что будет означать belongsTo в примечаниях не полиморфный, так как не будет любые производные классы, только Примечание себя. Не уверен, что ember (data) может правильно обработать это гнездование.

  • длина от Примечание. что, если я хочу иметь другие вещи, такие как адреса или контакты, которые могут быть связаны с клиентом или поставщиком?

  • создавать дубликаты моделей, таких как customernote/suppliernote, customercontact/suppliercontact, адрес клиента/поставщика/сотрудника. И иметь backend возвратить отфильтрованное имя таблицы/модели в зависимости от конечной точки. Я не люблю повторяться, хотя ....

Ember: 2.2.0
Ember данных: 2.2.1

ответ

0

Я люблю, как угасающий доктор объяснил полиморфизм здесь - https://guides.emberjs.com/v2.13.0/models/relationships/#toc_polymorphism

Итак, сначала вы должны иметь «тип», который будет определять модели, которые будут использоваться (ваши данные называют foreignType)

Далее, ваша модель ноты будет полиморфная модель (по аналогии с моделью PAYMENTMETHOD в примере або ве). Дайте мне знать в комментарии, если вам нужно больше разъяснений, но я думаю, что если вы будете следовать приведенному примеру, это будет очень ясно.

Смежные вопросы