ember.js - Ember 自引用和多态性

标签 ember.js ember-data

有一个用户模型也与自身相关作为联系人,所以 user has_many contacts .

每个联系人都拥有并属于许多“组”。用户和联系人都有一个地址。

我通读了http://lukegalea.github.io/ember_data_polymorphic_presentation/#/好几次了,但还是不明白如何设置{ user | contact } <-> address关系和contacts <-> groups Ember 方面的协会。

现在我有(简化的表示):

// Address
export default DS.Model.extend({
  city: DS.attr('string'),
  profile : DS.belongsTo('profile', { polymorphic: true, async: true })
});

// Profile
export default DS.Model.extend({
  name: DS.attr('string'),
  phone: DS.attr('string'),
  address: DS.belongsTo('address', {async: true})
});

// Contact
export default Profile.extend({
  groups: DS.hasMany('group')
});

// User
export default Profile.extend({

});

这是 JSON

// GET /contacts
{  
  "contacts":[  
    {  
      "name":"Conrad",
      "address_id":"1",
      "id":1
    },
    {  
      "name":"Greyson",
      "address_id":"2",
      "id":2
    },
    {  
      "name":"Tommie",
      "address_id":"3",
      "id":3
    }
  ]
}

// GET /addresses
{  
  "addresses":[  
    {  
      "city":"West Lillaton",
      "profile_id":"0",
      "profile_type":"Contact",
      "id":1
    },
    {  
      "city":"Weissnatborough",
      "profile_id":"1",
      "profile_type":"Contact",
      "id":2
    },
    {  
      "city":"Predovicton",
      "profile_id":"2",
      "profile_type":"Contact",
      "id":3
    },
    {  
      "city":"VKHA",
      "profile_id":1,
      "profile_type":"User",
      "id":4
    }
  ]
}
// GET /users
{  
  "users":[  
    {  
      "name":"Emile",
      "address_id":4,
      "id":1
    }
  ]
}

最佳答案

据我了解,这里不需要多态,因为您写道:“用户模型也与自身相关”。您应该为用户模型设置自反关系联系人

当您想要定义自反关系时,您必须显式定义另一边,并相应地设置显式逆关系,如果不需要另一边,请将逆关系设置为 null。

http://guides.emberjs.com/v1.12.0/models/defining-models/#toc_reflexive-relation

// User
export default DS.Model.extend({
  name: DS.attr('string'),
  phone: DS.attr('string'),
  address: DS.belongsTo('address', {async: true, inverse: 'user'})
  groups: DS.hasMany('group', {async: true}),
  contacts: DS.hasMany('user', { inverse: null }),
});

// Address
export default DS.Model.extend({
  city: DS.attr('string'),
  user: DS.belongsTo('user', { async: true, inverse: 'address' })
});

// Group
export default DS.Model.extend({
  name: DS.attr('string'),
  users: DS.hasMany('user', {async: true}),
});

如果您希望用户联系人使用不同的ember模型,那么 地址属于多态个人资料:

// Profile
export default DS.Model.extend({
  name: DS.attr('string'),
  phone: DS.attr('string'),
  address: DS.belongsTo('address', {async: true, inverse: 'profile'})
});

// Contact
export default Profile.extend({
  groups: DS.hasMany('group', {async: true}),
  user: DS.belongsTo('user', { async: true, inverse: 'contacts' })
});

// User
export default Profile.extend({
  contacts: DS.hasMany('contact', { inverse: 'user' }),
});

// Address
export default DS.Model.extend({
  city: DS.attr('string'),
  profile: DS.belongsTo('profile', { polymorphic: true, async: true, inverse: 'address' })
});

// Group
export default DS.Model.extend({
  name: DS.attr('string'),
  contacts: DS.hasMany('contact', {async: true}),
});

注意:GET 地址的正确 paylod 应该是:

// GET /addresses
{"addresses":[  
  {   
    "id":1,
    "city":"West Lillaton",
    "profile": {"id:"1", "type":"Contact"},
  },{   
    "id":2,
    "city":"West Lillaton",
    "profile": {"id:"2", "type":"User"},
  }
]}

关于ember.js - Ember 自引用和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30830369/

相关文章:

javascript - 为什么 Ember-Cli 3.14 抛出 ESLint No-New-Mixin 错误

javascript - Ember 3.5 属于关系未解决

javascript - Ember : store not available in Application. 初始值设定项

javascript - Ember.js ember-data restadapter 无法加载 json

jquery-mobile - 使用 Ember.js 处理视觉元素

ember.js - 尝试在 Ember 中渲染组件时找不到名为的帮助程序

postgresql - 在 ember 中与数组 id 有很多关系

ember.js - 使用 ember-data 导航时不重新加载页面时出现重复数据

ember.js - 是否有一个 API 可以从 ember-data 存储中获取模型及其属性定义?

javascript - 重新加载 Ember 数据模型