node.js - raw - sequelize query
ActualizaciĆ³n de atributos en modelos asociados usando Sequelize (1)
A tu pregunta:
Cuando carga con entusiasmo FilteredContent (con include), ya se ha creado una instancia del modelo, por lo que no hay razón para llamar a build
. Algo en la línea de esto debería hacer lo que quieres:
Filter.find({
where: { id: 3 },
include: [ { model : FilteredContent, as : ''filteredContent'' } ]
}).then ( function( filter ) {
return filter.filteredContent[0].updateAttributes({
content: ''crap''
})
}).then(function () {
// DONE! :)
});
Un par de consejos sobre el código que has publicado como un todo:
- sequelize.sync crea tablas de base de datos para sus modelos, si aún no existen. No es necesario para lo que quiere hacer si sus tablas ya existen
- sequelize.sync es una operación asíncrona, por lo que no es recomendable realizar sequelize.sync sin adjuntar una devolución de llamada. Además, parece que está sincronizando en una definición de modelo; solo debe hacerlo una vez, preferiblemente en el lugar donde define sus modelos.
- Parece que está definiendo varios modelos en un archivo; solo debe definir uno en cada archivo. Las asociaciones se podrían configurar haciendo sequelize.import ([ruta para filtrar el modelo) en su archivo FilterContent, o haciendo todas las asociaciones en el lugar donde importe sus modelos a su aplicación.
Editar para responder a tu comentario:
No puede hacer una llamada a una sola función que actualizará tanto el filtro como el contenido filtrado, pero tampoco tiene que hacer las actualizaciones en secuencia. Puede emitir todos los comandos de actualización sin esperar a que se completen.
Filter.find({
where: { id: 3 },
include: [ { model : FilteredContent, as : ''filteredContent'' } ]
}).then ( function( filter ) {
return Promise.all([
filter.updateAttributes({}),
filter.filteredContent.map(fc => fc.updateAttributes({}))
]);
}).spread(function (filter, filteredContents) {
})
De esta manera, todas las consultas se ejecutarán en paralelo y se llamará a su función then cuando todas se hayan completado. Tenga en cuenta que he usado la Promise.all
spread
aquí para convertir la matriz devuelta por Promise.all
en argumentos separados.
¿Es posible actualizar los atributos tanto en el modelo principal como en los modelos asociados de una sola vez? Estoy teniendo problemas para que funcione y no he podido encontrar ningún ejemplo completo. No estoy seguro si algo está mal con mi código o si no fue para funcionar como esperaba. Intenté agregar el onUpdate: ''cascada'' a mi definición de muchos, pero eso no pareció hacer nada.
Modelos:
module.exports = function( sequelize, DataTypes ) {
var Filter = sequelize.define( ''Filter'', {
id : {
type : DataTypes.INTEGER,
autoIncrement : true,
primaryKey : true
},
userId : DataTypes.INTEGER,
filterRetweets : DataTypes.BOOLEAN,
filterContent : DataTypes.BOOLEAN
},
{
tableName : ''filter'',
timestamps : false
}
);
var FilteredContent = sequelize.define( ''FilteredContent'', {
id : {
type : DataTypes.INTEGER,
autoIncrement : true,
primaryKey : true
},
filterId : {
type : DataTypes.INTEGER,
references : "Filter",
referenceKey : "id"
},
content : DataTypes.STRING
},
{
tableName : "filteredContent",
timestamps : false
}
);
Filter.hasMany( FilteredContent, { onUpdate : ''cascade'', as : ''filteredContent'', foreignKey : ''filterId'' } );
sequelize.sync();
return {
"Filter" : Filter,
"FilteredContent" : FilteredContent
};
}
Recuperar el filtro e intentar actualizar un atributo en el objeto FilteredContent asociado:
Filter.find({ where: { id: 3 },
include: [ { model : FilteredContent, as : ''filteredContent'' } ]
}).success ( function( filter ) {
var filteredContent = FilteredContent.build( {
filterId : filter.id,
id : 2,
content : ''crap''
});
filter.save();
});
Esto da como resultado que solo se actualicen los atributos en el objeto Filtro. ¿Cómo consigo que también actualice los atributos en FilteredContent?
Además, ¿es necesario sequelize.sync () después de definir mis modelos? No tengo claro qué es exactamente lo que se supone que haga. Soy capaz de recuperar mi objeto con asociaciones sin él. Lo agregué a mi código con desesperación para que las actualizaciones funcionaran, pero no estoy seguro de que sea realmente necesario.
Gracias