从实例方法更新水线模型
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);
});
我正在使用 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);
});