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.

¿Fue útil?

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

sectelize-virtual campos

// 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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top