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