sails.js和水线模型的设计奇迹。
我有一个"熊"模型和一个"位置"模型。他们持有一个一对多的关联("随着时间的推移,熊可以有多个位置")。
bear.js
module.exports = {
attributes: {
location: {
collection: 'location',
via: 'bear'
}
}
};
location.js
module.exports = {
attributes: {
timestamp: {
type: 'datetime',
required: true
},
bear: {
model: 'bear'
}
}
};
我正试图建立一个"一对一"的关联来获取熊的最后位置(lastLocation
),并想知道什么是最好的解决方案:
- 试图覆盖bear上的ToJSON,获取最后一个位置(似乎不起作用,因为ToJSON几乎不同步,所以我不能让它等待异步
find
) - 创建一个真正的oneToOne关系,并在位置上添加一个钩子AfterCreate来更新"lastLocation"关联
- 是否覆盖在位置创建的蓝图
- 重写蓝图添加熊
- 还有其他想法吗
感谢=)
我想这就是你的答案?
创建一个真正的oneToOne关系,并在位置上添加一个钩子AfterCreate来更新"lastLocation"关联?
您应该在熊上创建一个名为lastLocation:{model:'location'}
的附加属性,并在关联熊上创建每个位置后自动更新该属性。他们还有其他方法可以做到这一点,但如果最后一个位置是阅读量很大的东西,那么这可能是你最好的方法。
现在,这是一点基于意见的,因为在你的设计中肯定会有很多因素,但我认为你使用这种方法会很好。
以下是我最终得到的结果:
-
model/Bear.js-最后位置关联
lastLocation: { model: 'location' }
-
model/Location.js-
afterCreate
挂钩afterCreate: function(insertedLocation, callback) { if(!insertedLocation.bear) { return callback(); } Bear.findOneById(insertedLocation.bear, function(err, bear) { if(err) { return callback(err); } Location.findOneById(bear.lastLocation, function(err, oldLastLocation) { bear.lastLocation = insertedLocation.id; bear.save(function(err) { return callback(err); }); }); }); }
if(!insertedLocation.bear)
测试是的关键 -
我在
afterUpdate
挂钩内重复了类似的代码afterUpdate: function(updatedLocation, callback) { if(!updatedLocation.bear) { return callback(); } Bear.findOneById(updatedLocation.bear, function(err, bear) { if(err) { return callback(err); } Location.findOneById(bear.lastLocation, function(err, oldLastLocation) { bear.lastLocation = updatedLocation.id; bear.save(function(err) { return callback(err); }); }); }); }
添加一个测试,以防止每次更新lastLocation 时更新熊
- 可以添加一些
PublishUpdate()
逻辑