在app中,用户有两个关联 - 帐单地址和公司地址相同
//address
export default DS.Model.extend({
email: DS.attr('string'),
country: DS.attr('string'),
zip: DS.attr('string'),
user: DS.belongsTo('user')
//...
});
//user
export default DS.Model.extend({
name: DS.attr('string'),
company: DS.belongsTo('address'),
billing: DS.belongsTo('address')
//...
});
如何拉这种伎俩?
答案 0 :(得分:0)
我要做的是使用多态关系。步骤将是(我假设是ember-cli,如果没有,那么gist是相同的):
ember generate model address
ember generate model company-address
ember generate model billing-address
在models/address.js
中,您可以定义实际的地址模型:
export default DS.Model.extend({
email: DS.attr('string'),
country: DS.attr('string'),
zip: DS.attr('string'),
user: DS.belongsTo('user')
//...
});
然后在其他模型中,您从父模型扩展(多态保存了一天!)。
公司地址
import Address from './address';
export default Address.extend({
// Yeah, its empty.
});
帐单地址
import Address from './address';
export default Address.extend({
// But, you could add custom fields here and
// still share the ones with the parent
// Polymorphism.
});
现在在您的用户模型中执行此操作:
export default DS.Model.extend({
name: DS.attr('string'),
company: DS.belongsTo('address', {polymorphic: true}),
billing: DS.belongsTo('address', {polymorphic: true})
});
虽然没有免费的午餐,但您的JSON现在必须更改其格式:
{ name: 'foobar',
company: {
// company fields or id if async
type: 'company-address'
},
billing: {
// billing fields or id if async
type: 'billing-address'
}
}
答案 1 :(得分:0)
您正在寻找inverse
选项。
地址模型上需要两个字段,一个是指具有此地址的公司,一个是指具有此地址的用户。然后,使用inverse
选项指定哪个。
//address
export default DS.Model.extend({
...
billing: DS.belongsTo('user', { inverse: 'billing' })
company: DS.belongsTo('user', { inverse: 'company' })
});
//user
export default DS.Model.extend({
...
company: DS.belongsTo('address'),
billing: DS.belongsTo('address')
});
请参阅http://emberjs.com/guides/models/defining-models#toc_explicit-inverses。
对于您要做的事情,没有任何理由来定义两个单独的派生模型,只是为了正确设置关联。 inverse
正是您所需要的。