2014-01-10 2 views
2

При использовании отношений hasMany и belongsTo в Ember-Data, нужно ли указывать класс, или я могу указать mixin? Например, у меня есть модель Attachement, которую я хочу связать с некоторыми другими моделями. В частности, я хочу присвоить Attachement s Project s и Components. Могу ли я использовать mixin на Projects и Component и использовать этот mixin как обратный, как показано ниже?Полиморфная связь с mixin

App.Attachment = DS.Model.extend({ 
    attachedTo: DS.belongsTo('canHaveAttachments', { inverse: 'attachments'}); 
}); 

App.CanHaveAttachmentsMixin = DS.Mixin.create({}); 

App.Project = DS.Model.extend(App.CanHaveAttachmentsMixin, { 
    attachments: DS.hasMany('attachment', { inverse: 'attachedTo' }); 
}); 

Это что-то официально поддерживается Ember?

ответ

1

Я провел последний день тестирования и исследования этой проблемы, и я наконец нашел ответ: нет. Я довольно много тестировал и не мог заставить его работать. Наконец, я понял, что это потому, что mixins (насколько я могу судить) не входят в цепочку прототипов объекта.

Чтобы решить эту проблему, я просто использовал несколько отношений вместо одного полиморфного. Это не совсем объектно-ориентированное, но более явное.

4

В нашем проекте с использованием Ember 2.4 у нас есть несколько объектов, Task, Assignment и Tag. Задача taggable и назначается через полиморфные ассоциации.

Это наша модель структуры:

// app/models/task.js 
import DS from 'ember-data'; 
import Taggable from 'app/mixins/taggable'; 
import Assignable from 'app/mixins/assignable'; 

export default DS.Model.extend(Taggable, Assignable, { 

}); 

// app/models/tag.js 
import DS from 'ember-data'; 

export default DS.Model.extend({ 
    taggable: DS.belongsTo('taggable', { polymorphic: true }), 
}); 

// app/models/assignment.js 
import DS from 'ember-data'; 

export default DS.Model.extend({ 
    assignable: DS.belongsTo('assignable', { polymorphic: true }), 
}); 


// app/mixins/taggable.js 
import Ember from 'ember'; 
import DS from 'ember-data'; 

export default Ember.Mixin.create({ 
    tag: DS.belongsTo('tag'), // you can go with hasMany here, we only have one-to-one association 
}); 


// app/mixins/assignable.js 
import Ember from 'ember'; 
import DS from 'ember-data'; 

export default Ember.Mixin.create({ 
    assignment: DS.belongsTo('assignment'), // you can go with hasMany here, we only have one-to-one association 
}); 
Смежные вопросы