es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo se excluyen e incluyen campos en Sequelize mediante alcance?

const getMe = await UserModel.scope(“test”).findOne({
where: {
uid: uid,
},
include: [
{
model: GroupModel,
as: “groups”,
include: [“product”],
},
],
});

defaultScope: {
attributes: {
exclude: [“id”],
},
},
scopes: {
test: {
attributes: {
exclude: [“email”],
},
},
},

asociaciones

UserModel.hasMany(GroupModel, { as: “groups” });

Groupmodel.belongsTo(UserModel, {
foreignKey: “userId”,
as: “user”,
});
GroupModel.belongsTo(ProductModel, {
foreignKey: “productId”,
as: “product”,
});

Como prueba, excluyo por defecto “id” y con el ámbito de prueba excluyo “email”. He probado de todo, desde usar exclude, include y establecer attributes directamente en la llamada findOne. Nada funciona.

¿Cuál es la forma correcta de excluir ciertos campos, por ejemplo, para devoluciones “Públicas”, e incluir todos los campos para un ámbito “Administrador” de algún tipo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para excluir ciertos campos para un alcance en particular, puedes definir un alcance específico con los atributos que quieres excluir o incluir. Por ejemplo:

    defaultScope: {
      attributes: {
        exclude: ['id'],
      },
      include: [
        {
          model: GroupModel,
          as: 'groups',
          include: ['product'],
        },
      ],
    },
    scopes: {
      public: {
        attributes: {
          exclude: ['email'],
        },
      },
    },
    

    Aquí, hemos definido un alcance predeterminado que excluye el atributo ‘id’ e incluye la asociación ‘groups’ con el atributo ‘product’. También tenemos un alcance ‘public’ que excluye adicionalmente el atributo ’email’.

    Para usar estos alcances, puedes llamar al método ‘scope’ en tu modelo antes de llamar a ‘findOne’, de la siguiente manera:

    const publicUser = await UserModel.scope('public').findOne({
      where: {
        uid: uid,
      },
    });
    
    const adminUser = await UserModel.scope('defaultScope').findOne({
      where: {
        uid: uid,
      },
      include: [
        {
          model: GroupModel,
          as: 'groups',
          include: ['product'],
        },
      ],
    });
    

    Aquí, estamos utilizando el alcance ‘public’ para recuperar un usuario sin el atributo ’email’, y el alcance ‘defaultScope’ con la asociación ‘groups’ para recuperar un usuario con todos los atributos y asociaciones.

Comments are closed.