Ember数据:重复使用一个模型用于两个伪装

时间:2015-02-24 04:41:02

标签: ember.js ember-data

在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')
  //...
});

如何拉这种伎俩?

2 个答案:

答案 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正是您所需要的。