Sails 自定义 model 方法
在 Sails 中 model 提供了一些原生的静态方法,如 .create(), .update(), .destroy(), .find(), 等。
在实际业务中,有个经常做的操作是,在保存对象时,如果对象不存在就新增这个对象,否则就更新,就是一个 insertOrUpdate 的操作。而 model 中并未提供这个方法。
MongoDB 倒是提供了个类似的原生方法,在 update 对象时加入 {upsert=true} 这个选项,但是返回的结果是一个数字,并不是 update 的对象,这点不符合需求。
那就考虑拓展 model 的的静态方法吧,sails 提供了很方便的拓展支持。
在 model.js 中加入以下方法。
module.exports.models = {
insertOrUpdate: function(key, record, CB){
var self = this; // reference for use by callbacks
var where = {};
where[key] = record[key]; // keys differ by model
this.find(where).exec(function findCB(err, found){
if(err){
CB(err, false);
}
// did we find an existing record?
if(found && found.length){
self.update(record[key], record).exec(function(err, updated){
if(err) { //returns if an error has occured, ie id doesn't exist.
CB(err, false);
} else {
CB(false, found[0]);
}
});
}else{
self.create(record).exec(function(err, created){
if(err) { //returns if an error has occured, ie invoice_id doesn't exist.
CB(err, false);
} else {
CB(false, created);
}
});
}
});
}
};
这样就可以了,像调用 create 方法一样调用自定义的 insertOrUpdate 方法。
参考:
http://stackoverflow.com/a/25938914
http://sailsjs-documentation.readthedocs.org/en/latest/concepts/Models/