【问题标题】:Override sails update to return just one object覆盖风帆更新以仅返回一个对象
【发布时间】:2017-02-01 15:28:14
【问题描述】:
当我更新模型时,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
});
为了使用更新的记录,我必须指出0 索引,如updatedRecord[0],我认为这不是很干净。根据文档update() in sails,这是一个常见的场景。
知道了,我有两个问题:
当您发现一个模型只返回该模型的更新对象而不是数组时,这不是更好吗?
-
如果这是一个约定,当.update() 只影响一条记录时,如何重写此函数以便只返回一个对象而不是数组?
【问题讨论】:
标签:
arrays
callback
sails.js
sails-postgresql
waterlock
【解决方案1】:
这是一个约定,它将更新与查找条件匹配的所有记录,但由于您可能在模型上使用 unique 验证,它可能会返回一个 1 或 0 的数组。您需要自己动手。
您可以通过实现与默认水线同名的方法来覆盖模型中的方法。但是由于您需要完全重写代码,所以它是不可行的。既不改变水线底层代码。
解决方案是在您的广告模型上创建一个新函数:
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)已经将这个属性添加为默认值,并且可能会与您的模型发生冲突。
【解决方案2】:
我不认为它可能与水线。因为update方法是一个泛化的方法,在where条件总是不这样的情况下传递一个主键。