Ember.js 余烬自我参照与多态性

Ember.js 余烬自我参照与多态性,ember.js,ember-data,Ember.js,Ember Data,有一个用户模型,它本身也与联系人相关,因此用户有许多联系人 每个联系人都拥有并属于许多“组”。用户和联系人都有一个地址 我读了好几遍,但仍然不知道如何在余烬端设置{user | contact}地址关系和联系人组关联 现在我有(简化的表述): 这里是JSON // GET /contacts { "contacts":[ { "name":"Conrad", "address_id":"1", "id":1 }, {

有一个用户模型,它本身也与联系人相关,因此
用户有许多联系人

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

我读了好几遍,但仍然不知道如何在余烬端设置
{user | contact}地址
关系和
联系人组
关联

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

这里是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

如果您希望
用户
联系
成为不同的余烬型号
,则
地址
属于多态
配置文件

// 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"},
  }
]}

(??)用户模型,它本身也与联系人相关(它意味着
联系人
用户
模型中的一个自我关系名称),但您将
联系人
定义为不同的模型,而且您有api
//GET/contacts
方法。这里有点不对劲。似乎术语有点混乱,也许最好称这个概念为“自连接”?其想法是,这些实体存储在后端的一个表中,如railscasts.com/scents/163-self-referential-association所述,但“用户”和“联系人”是不同的类型:用户-有“活动”字段,“联系人”没有联系人-有并属于“组”,而用户没有。它们还用于不同的目标:用户是“当前用户”,“联系人”只是常规业务实体。“存储在一个表中”+“Rails中有不同类型的”=>STI吗?谢谢!你连续第二次救了我!p、 它们都没有自己的后端逻辑,所以没有继承,因为它们由一个类表示。p、 另外,我认为内联指定关联细节(JSON)也应该有效
profile\u type:'Contact',profile\u id:1
。但事实并非如此,也许你知道为什么吗?因为当持久化记录保存这两个变体时,这看起来真的很难看。
// 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 /addresses
{"addresses":[  
  {   
    "id":1,
    "city":"West Lillaton",
    "profile": {"id:"1", "type":"Contact"},
  },{   
    "id":2,
    "city":"West Lillaton",
    "profile": {"id:"2", "type":"User"},
  }
]}