SECUSIZAR, Problema para obtener asociaciones para devolver
-
28-10-2019 - |
Pregunta
Actualmente estoy experimentando con SECLELIZE y tengo dos objetos, un Person
y Position
, Al obtener una lista de personas, quiero obtener su posición.
Modelos:
var User = sequelize.define('user', {
first_name: Sequelize.STRING,
last_name: Sequelize.STRING
});
var Position = sequelize.define('position', {
name: Sequelize.STRING,
affiliation: Sequelize.STRING
});
Position.hasMany(User, { foreignKey : 'position_id' });
User.belongsTo(Position, { foreignKey : 'position_id'});
Mi consulta:
User.findAll({ fetchAssociations: true }, function(results) {
//I've tried doing some work in here, but haven't found the correct procedure.
}).on('success', function(results) {
res.render('users', {
title: 'user page',
users: results
});
});
Viendo el registro nunca consultas Person
en absoluto. ¿Necesito usar consulta? De la documentación pude encontrar que parecía que debería obtener asociaciones automáticas.
Solución
Ok, aquí un ejemplo completo de cómo solucionar su problema (y sí, eso es una mierda):
User.findAll().on('success', function(users) {
var chainer = new Sequelize.Utils.QueryChainer
, _users = []
users.forEach(function(u) {
var emitter = new Sequelize.Utils.CustomEventEmitter(function() {
u.getPosition().on('success', function(pos) {
_users.push({user: u, position: pos})
emitter.emit('success')
})
})
chainer.add(emitter.run())
})
chainer.run().on('success', function() {
res.render('users', {
title: 'user page',
users: _users
})
})
})
Primero obtendrá a todos los usuarios, luego obtendrá la posición de cada usuario y los guardará en la matriz _users. Luego representa la página. No se prueba, pero debe hacer el truco.
Otros consejos
A partir de abril de 2013 en V1.7.0, solo necesita expandir su Asociaciones a:
Position.hasMany(User, {foreignKey : 'position_id', as: 'User'});
User.belongsTo(Position, {foreignKey : 'position_id', as: 'Posit'});
y luego encuentre a todos los usuarios con posiciones asociadas
User.findAll({
include: [{
model: Position, as: 'Posit'
}]
}).success(function(match) {
// your logic
});
Desde que reescribí la secuencia para 1.0, eliminé el soporte de fetchassociaciones. Lo agregaré en las próximas semanas. Pero echemos un vistazo a su código:
Está utilizando los nombres de columnas con forma de subscore, por lo que es probable que desee usar la opción de bajo costo para columnas generadas automáticamente: http://www.sequelizejs.com/?active=usage#usage -> Desplácese un poco hacia abajo o busque bajo. Esto podría ahorrarle las opciones para Perirsto/Hasmany.
Lo que quieres hacer con Findall es SMTH. como esto:
User.findAll().on('success', function(users) {
// asd
})
Y como acabo de notar ... es algo difícil obtener todos los objetos asociados: D mucho por ahora. Espero que eso ayudara.
Esto permite serializar una acción JSON para cualquier lugar sobre un modelo. Léelo, muy bien, creo que esa es la mejor manera
// define models
var Person = sequelize.define('Person', { name: Sequelize.STRING });
var Task = sequelize.define('Task', {
name: Sequelize.STRING,
nameWithPerson: {
type: Sequelize.VIRTUAL,
get: function() { return this.name + ' (' + this.Person.name + ')' }
attributes: [ 'name' ],
include: [ { model: Person, attributes: [ 'name' ] } ],
order: [ ['name'], [ Person, 'name' ] ]
}
});
// define associations
Task.belongsTo(Person);
Person.hasMany(Task);
// activate virtual fields functionality
sequelize.initVirtualFields();