从实例方法更新水线模型

Updating a waterline model from an instance method

我正在使用 Waterline ORM 连接我的数据库。

我将 Waterline.Collections 扩展到一个新对象并将它们分配给一个模块:

var Waterline = require('waterline');

var User = Waterline.Collection.extend({
    ...some fields...
    attributes:{
        col_a:{
             type:'integer'
        },
        touch_user:function(){
            //   increment col_a and update in table
        }
    }
});

export = module.exports = User;

我查询我需要更新的特定模型,然后在承诺中操作它们。

database.models.users.findAll().where({'id':1}).then(...model manipulation...)

有一项任务是我经常执行的,几乎每次我访问模型时都会执行。我想将这个任务封装在与实例关联的函数中,这样我就可以简单地调用 "touch_user" 并且相关字段将为我调用它的模型更新。

像这样查询模型后,我无法从模型实例访问 Waterline 查询方法(例如 .update()):

database.models.users.findAll().where({'id':1).then((user)=>{
    user.touch_user();
    //user.update    // does not work
});

但直到我查询它,我才检索到与该记录关联的数据。 我希望 user.touch_user() 在用户 table 中增加 col_a 类似于以下

database.models.users.findAll().where({'id':1).then((user)=>{
    user.touch_user();
    database.models.users.update(user.id, {'col_a':user.col_a+1});
});

上面的问题是用户对象没有准确反映对table的更新。

我最后做的是创建一个 class 方法来更新模型和实例。不完全是我想要的,但它确实可以保持模型和 table 同步

var User = Waterline.Collection.extend({
    ...some fields...
    attributes:{
         col_a:{
              type:'integer'
         },
     },
     //  touch_user is a class method here
     touch_user:function(user){
         // update model instance
         user.col_a += 1;
         // update database table
         database.models.users.update(user.id, {'col_a':user.col_a).exec(function(){});
     }
});

这样称呼

database.models.users.findAll().where({'id':1).then((user)=>{
    ...modify user...
    database.models.users.touch_user(user);

    ...other changes to user that have to occur here...
    database.models.users.touch_user(user);
});