我正在使用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});
});
上述问题是用户对象无法准确反映对表的更新。
答案 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);
});