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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.