我正在使用Sails.js v0.10.5,但这可能适用于更一般的MVC生命周期逻辑(Ruby on Rails?)。
我有两个模型,比如Foo
和Baz
,与一对一关联相关联。
每次Foo
实例中的数据发生更改时,必须在Baz
模型实例上执行一些繁重的操作,例如下面显示的costlyRoutine
方法。
// api/model/Foo.js
module.exports {
attributes: {
name: 'string',
data: 'json',
baz: {
model: 'Baz'
}
},
updateBaz: function(criteria,cb) {
Foo.findOne( criteria, function(err,foo) {
Baz.findOne( foo.baz, function(err,baz) {
baz.data = costlyRoutine( foo.data ); // or whatever
cb();
});
});
}
}
更新Foo
的实例后,首先测试data
是否已从旧对象更改为新对象是有意义的。可能只需更新name
,在这种情况下,我想避免繁重的计算。
什么时候最好进行检查?
我正在考虑beforeUpdate
回调,但需要调用类似Foo.findOne(criteria)
的内容来检索当前的data
对象。效率低下?次优?
答案 0 :(得分:0)
我能想到的唯一优化:
如果相关字段正在更新,您可以致电
costlyRoutine
。
除此之外,您可以尝试缓存Foo
(使用一些引用缓存的位置,如分页)。但这取决于你的用例。
完美优化就像试图展望未来一样:D
答案 1 :(得分:0)
您可以使用afterUpdate
回调保存一点,这样就可以加载Foo
对象,这样您就可以保存通话。
// api/model/Foo.js
module.exports {
attributes: {
...
},
afterUpdate: function(foo,cb) {
Baz.findOne( foo.baz, function(err,baz) {
baz.data = costlyRoutine( foo.data ); // or whatever
cb();
});
}
}
否则为myusuf aswered,如果您只需要根据相关字段进行更新,那么您可以在beforeUpdate
回调中点按它。
顺便说一下,实例函数应该在attributes
prop内部定义,生命周期回调在外面。