首页 > 技术文章 > Sails 自定义 model 方法

myfjd 2015-07-14 19:01 原文

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/

推荐阅读