7

I have a user model in Sequelize for a Postgres db:

var User = sequelize.define('User', {
fb_id: DataTypes.STRING,
access_token: DataTypes.TEXT,
first_name: DataTypes.STRING,
last_name: DataTypes.STRING,
email: DataTypes.TEXT,
profilePictureURL: DataTypes.TEXT,
library: DataTypes.ARRAY(DataTypes.STRING)
}, {
underscored: true,
classMethods: {
  associate: function(models) {

   }
 }
  });

I am trying to update the library field by adding ISBNs to the array. This is the code for my POST request:

req.user.library.push(req.body._isbn); // adding the posted ISBN to the user object in my express-session

User.findOrCreate({where: {fb_id: req.user.fb_id}, 
        defaults: {
            access_token :      req.user.access_token,                 
            first_name :        req.user.first_name,
            last_name :         req.user.last_name,
            email :             req.user.email, 
            profilePictureURL : req.user.profilePictureURL,
            library: req.user.library // new library object
        }})
        .spread(function (updatedUser, created){
            res.status(200).json(updatedUser);
        }).error(function(err){
            res.status(500).json(err);
        });

There is no error, but the library field is not updated after checking the updatedUser object. How do I correctly update an array field in Sequelize?

3 Answers 3

3

I ran into this before and found the answer deep in their Github issues. The way I accomplished it is

User.find({
  where: {
    fb_id: req.user.fb_id
  }
})
.then((user) => {
  user.library.push(req.body._isbn)
  user.update({
    library: user.library
  },{
    where: {
      fb_id: req.user.fb_id
    }
  })
  .then(user => res.json(user))
})

It definitely feels like there is a better way, but this way how I found a way.

Sign up to request clarification or add additional context in comments.

Comments

3

For next visitors, I may have found a better way to solve this issue :

User.update(
 {library: Sequelize.fn('array_append', Sequelize.col('library'), req.body._isbn)},
 {where: {fb_id: req.user.fb_id}}
);

1 Comment

Posting code is great, but please try to add some text to describe what you've done.
0

Kinda old issue but I found a workaround that could help in the future, from what I understand sequelize may not recognize an updated data as new instance so it will consider it as local scope only. Solution for me was to create a new object upon the needed array, something like:

let newArray = Object.assign([], instance.arrayToUpdate);

newArray.push(myInterestingData)
await instance.update({
  arrayToUpdate: newArray
});

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.