2016-08-25 1 views
2

Comportement attendu: la mise à jourmodèle Sails.js updatedAt (updated_at) pas automatiquement la mise à jour

Après avec succès un enregistrement à l'aide .update(), champ updated_at de l'enregistrement doit mise à jour automatique à l'heure actuelle.

Note: J'ai changé le réglage autoUpdatedAt (également mentionné here) à l'aide autoUpdatedAt: 'updated_at' dans config.models de sorte que le champ est intitulé updated_at au lieu de updatedAt. Il devrait toujours avoir la même fonctionnalité que je suppose.

Comportement réel:

Le modèle met à jour avec succès, mais il ne met pas à jour le champ updated_at.

code d'exécution:

model.update(primary, data) 
.then(function updateCB(updated){ 
    // error handling 
    sails.log('Updated successfully'); 
    sails.log(updated); 
}); 

Questions:

  • Pourquoi est-ce?
  • Comment résoudre ce problème?

Résultat: Problème pour Voiles

j'ai pu le reproduire sur un nouveau projet, il semble que ce soit un problème avec des voiles. Lien de problème: https://github.com/balderdashy/sails/issues/3821

Voir ma réponse ci-dessous pour plus d'informations.

+0

Pouvez-vous montrer à quoi ressemble l'attribut 'updated_at' dans votre fichier modèle? – Ryan

+0

Ce n'est pas un attribut dans le fichier modèle; c'est une commande au niveau des voiles pour renommer l'attribut autoUpdatedAt - je l'ai lié dans la note. – smileham

+0

ah, il y a votre problème :) – Ryan

Répondre

4

Je ne peux pas répondre au 'pourquoi' J'ai essayé la même chose et j'ai rencontré le même problème. Quant à la façon de le fixer -

Je l'ai fait un attribut dans mon fichier de modèle pour tous les modèles que je voulais sur et rempli dehors comme ceci:

updated_at:{ 
     type: 'datetime', 
     defaultsTo: function(){return new Date();} 
    } 

Avec la colonne dans mon DB (MySQL ce cas) étant défini sur NOT NULL et DATETIME et défini pour mettre à jour CURRENT_TIMESTAMP on UPDATE.

Vous pouvez aussi mettre dans votre code si vous n'avez pas accès à votre base de données, juste avant l'appel de mise à jour:

data.updated_at = new Date(); 
model.update(primary,data).... 

qui accomplira la même chose.

Cela a été le travail le plus simple que j'ai pu faire.

Je me suis penser à ce sujet et je suis venu avec une troisième option, une méthode de modèle écrit comme ceci:

attributes:{ 
    //stuffs 
}, 
beforeUpdate: function(obj, next){ 
    obj.updated_at = new Date(); 
    return next(null, obj); 
} 

Le null dans la première position est parce que ce que je peux dire Sails attend un error objet tout au long de la chaîne d'appel, donc si je ne passais rien le long alors la chose entière crapped out.

+0

Etes-vous sûr que cela fonctionne pour la mise à jour? Il sera défini par défaut sur create, donc cela fonctionnera pour 'created_at', mais je ne suis pas sûr de la mise à jour. Évidemment, je préférerais une solution de configuration, mais jusqu'à ce que Sails la répare, je suis ouvert à une solution manuelle. – smileham

+0

@smileham, oh opps, j'ai oublié une étape, il y a 2 façons de gérer cela. Depuis que j'ai un contrôle total sur mon projet, je l'ai fait au niveau db mais vous pouvez le faire en code et voir mon édition. – Ryan

+0

Gotcha. Lors de la mise à jour, est ce que 'updated_at' change les valeurs? Il a déjà une valeur à partir de quand il a été créé. – smileham

0

Résultat: Problème pour Voiles

j'ai pu le reproduire sur un nouveau projet, il semble que ce soit un problème avec des voiles. Problème lien: https://github.com/balderdashy/sails/issues/3821

code d'exécution:

Test.create() 
.then(function(created){ 
    sails.log('created'); 
    sails.log(created); 

    Test.update(created, {}) 
    .then(function(updated){ 
     sails.log('updated'); 
     sails.log(updated[0]); 

     Test.findOne(updated) 
     .then(function(found){ 
      sails.log('found'); 
      sails.log(found); 

      res.end(); 
     }); 
    }); 
}); 

code Résultat:

debug: created 
debug: { createdAt: '2016-08-25T21:35:46.679Z', 
    updated_at: '2016-08-25T21:35:46.679Z', 
    id: 1 } 
debug: updated 
debug: { createdAt: '2016-08-25T21:35:46.679Z', 
    updated_at: '2016-08-25T21:35:46.679Z', 
    id: 1, 
    updatedAt: '2016-08-25T21:35:46.698Z' } 
debug: found 
debug: { createdAt: '2016-08-25T21:35:46.679Z', 
    updated_at: '2016-08-25T21:35:46.679Z', 
    id: 1, 
    updatedAt: '2016-08-25T21:35:46.698Z' } 

On dirait que Sails ajoute encore un champ updatedAt qui ne sauve pas à ma base de données SQL .