覆盖sails更新以仅返回一个对象

时间:2017-02-01 15:28:15

标签: arrays callback sails.js sails-postgresql waterlock

当我更新模型时,水锁.update()总是返回一个对象数组,即使我设置了primaryKey标准。

我的代码

Ad.update({ id: req.param('id') }, {
    // desired attributed to be updated
}).exec(function(err, updatedRecord) {
    // updatedRecord is always an array of objects
});    

为了使用updatedRecord,我必须指出像0这样的updatedRecord[0]索引,这是我认为不太干净的东西。根据文档update() in sails,这是一个常见的情节。

知道这一点,我有两个问题:

  1. 当你发现一个模型只返回该模型的更新对象而不是数组时,会不会更好?

  2. 如果这是一个约定,.update()只影响一条记录时,怎么可以覆盖此函数以便只返回一个对象而不是一个数组?

2 个答案:

答案 0 :(得分:1)

它是一个约定,它将更新匹配查找条件的所有记录,但由于您可能在模型上使用唯一验证,它可能会返回1或0的数组。你需要手头做。

您可以通过实现与waterline default同名的方法来覆盖模型中的方法。但是,由于您需要完全重写代码,因此它不可行。都没有改变水线底层代码。

解决方案是在广告模型上创建新功能:

module.exports = {
  attributes: {
    adid: {
      unique: true,
      required: true
    },
    updateMe: {
    }
  },
  updateOne: function(adid, newUpdateMe, cb){
    Ad.update({ id: req.param('id') }, {
    // desired attributed to be updated
    }).exec(function(err, updatedRecord) {
        // updatedRecord is always an array of objects
        if (updatedRecord.length == 1){
          return cb(null, updatedRecord[0]);
        }
        return cb(null, {}); //also can error if not found.
    });    
  }
};

另外。避免使用id作为模型属性(使用其他名称),因为某些数据库(如mongodb)已将此属性添加为默认值,并可能导致与模型冲突。

答案 1 :(得分:0)

我不认为它可能与水线。因为更新方法是一个通用的方法,在条件总是不是这样的情况下传递主键。