Sails.js oneToOne 指向 oneToMany 上的最后一个
Sails.js oneToOne pointing to last on oneToMany
sails.js 和水线模型的设计奇迹。
我有一个 "bear" 模型和一个 "location" 模型。他们拥有 oneToMany 关联 ("bear can have multiple location over time")。
bear.js
module.exports = {
attributes: {
location: {
collection: 'location',
via: 'bear'
}
}
};
location.js
module.exports = {
attributes: {
timestamp: {
type: 'datetime',
required: true
},
bear: {
model: 'bear'
}
}
};
我正在尝试创建一个 "oneToOne" 关联来获取熊的最后位置 (lastLocation
),并想知道最佳解决方案是什么:
- 尝试覆盖 bear 上的 ToJSON,获取最后一个位置(似乎不起作用,因为 ToJSON 很难同步,所以我不能让它等待异步
find
)
- 创建一个真正的 oneToOne 关系并在位置上添加一个挂钩 AfterCreate 以更新该 "lastLocation" 关联?
- 覆盖在位置创建的蓝图?
- 覆盖蓝图添加到熊?
- 还有其他想法吗?
谢谢=)
我想这就是你的答案?
Creating a real oneToOne relationship and adding a hook AfterCreate on location to update that "lastLocation" association ?
您应该在 bear 上创建一个名为 lastLocation:{model:'location'}
的附加属性,并在关联的 bear 上创建每个位置后自动更新该属性。他们有其他方法可以做到这一点,但如果最后一个位置是被大量阅读的东西,那么这可能是你最好的方法。
现在这是一些基于意见的观点,因为您的设计中肯定会涉及许多因素,但我认为您可以使用这种方法。
这是我最终得到的:
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 时都更新 bear
- 可以添加一些
PublishUpdate()
逻辑
sails.js 和水线模型的设计奇迹。
我有一个 "bear" 模型和一个 "location" 模型。他们拥有 oneToMany 关联 ("bear can have multiple location over time")。
bear.js
module.exports = {
attributes: {
location: {
collection: 'location',
via: 'bear'
}
}
};
location.js
module.exports = {
attributes: {
timestamp: {
type: 'datetime',
required: true
},
bear: {
model: 'bear'
}
}
};
我正在尝试创建一个 "oneToOne" 关联来获取熊的最后位置 (lastLocation
),并想知道最佳解决方案是什么:
- 尝试覆盖 bear 上的 ToJSON,获取最后一个位置(似乎不起作用,因为 ToJSON 很难同步,所以我不能让它等待异步
find
) - 创建一个真正的 oneToOne 关系并在位置上添加一个挂钩 AfterCreate 以更新该 "lastLocation" 关联?
- 覆盖在位置创建的蓝图?
- 覆盖蓝图添加到熊?
- 还有其他想法吗?
谢谢=)
我想这就是你的答案?
Creating a real oneToOne relationship and adding a hook AfterCreate on location to update that "lastLocation" association ?
您应该在 bear 上创建一个名为 lastLocation:{model:'location'}
的附加属性,并在关联的 bear 上创建每个位置后自动更新该属性。他们有其他方法可以做到这一点,但如果最后一个位置是被大量阅读的东西,那么这可能是你最好的方法。
现在这是一些基于意见的观点,因为您的设计中肯定会涉及许多因素,但我认为您可以使用这种方法。
这是我最终得到的:
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 时都更新 bear
- 可以添加一些
PublishUpdate()
逻辑