ember.js - data - Ember autorreferencia y polimorfismo
ember tutorial (1)
hay un modelo de usuario que también se relaciona a sí mismo como contacto para que el user has_many contacts
.
Que cada contacto tiene y pertenece a muchos "grupos". Tanto el usuario como el contacto tienen una dirección.
Leí en http://lukegalea.github.io/ember_data_polymorphic_presentation/#/ un par de veces, pero todavía no entiendo cómo configurar { user | contact } <-> address
{ user | contact } <-> address
relación de { user | contact } <-> address
y una asociación de contacts <-> groups
en el lado Ember.
Ahora mismo tengo (una representación simplificada):
// 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({
});
Aquí está el 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
}
]
}
Por lo que yo entiendo no hay necesidad en polimórficos aquí, porque escribiste: "modelo de usuario que también se relaciona a sí mismo ". Debe establecer contacts
relación reflexiva para user
modelo de user
.
Cuando quiera definir una relación reflexiva, debe definir explícitamente el otro lado y establecer el inverso explícito en consecuencia, y si no necesita el otro lado, establezca el inverso en nulo.
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}),
});
Si desea que el user
y el contact
sean diferentes modelos de brasas, entonces debe address
profile
polimórfico de belongsTo:
// 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}),
});
Nota: el pago correcto para las direcciones GET debe ser:
// GET /addresses
{"addresses":[
{
"id":1,
"city":"West Lillaton",
"profile": {"id:"1", "type":"Contact"},
},{
"id":2,
"city":"West Lillaton",
"profile": {"id:"2", "type":"User"},
}
]}