从实例方法

时间:2016-12-18 05:48:48

标签: node.js waterline

我正在使用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()在users表中增加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});
});

上述问题是用户对象无法准确反映对表的更新。

1 个答案:

答案 0 :(得分:0)

我最终做的是创建一个类方法来更新模型和实例。不完全是我想要的,但它确实在紧要关系中保持模型和表同步

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);
});