Model view controller 更新时,如何将模型实例与其以前的状态进行比较
我使用的是Sails.jsv0.10.5,但这可能适用于更通用的MVC生命周期逻辑rubyonrails 我有两个模型,比如Foo和Baz,它们通过一对一的联系联系在一起。 每次Foo实例中的数据发生更改时,都必须对Baz模型实例执行一些繁重的操作,如下面所示的costlyRoutinemethodModel view controller 更新时,如何将模型实例与其以前的状态进行比较,model-view-controller,sails.js,lifecycle,Model View Controller,Sails.js,Lifecycle,我使用的是Sails.jsv0.10.5,但这可能适用于更通用的MVC生命周期逻辑rubyonrails 我有两个模型,比如Foo和Baz,它们通过一对一的联系联系在一起。 每次Foo实例中的数据发生更改时,都必须对Baz模型实例执行一些繁重的操作,如下面所示的costlyRoutinemethod // api/model/Foo.js module.exports { attributes: { name: 'string', data: 'json', baz
// 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实例时,首先测试数据是否已从旧对象更改为新对象是有意义的。可能只是名称需要更新,在这种情况下,我希望避免繁重的计算
什么时候结账最好
我考虑使用beforeUpdate回调,但它需要调用Foo.findOnecriteria之类的函数来检索当前数据对象。效率低下?次优?我能想到的唯一优化: 如果相关字段正在更新,则可以调用costlyRoutine 除此之外,您还可以尝试使用引用缓存的某些局部性(如分页)来缓存Foo。但这取决于您的用例
完美的优化实际上就像是尝试展望未来:D您可以通过使用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();
});
}
}
否则,如果只需要根据相关字段进行更新,则可以在beforeUpdate回调中点击它
顺便说一句,实例函数应该在attributes prop内部定义,生命周期回调在外部。关于实例函数,同意-但updateBaz既不是实例函数,也不是生命周期回调。至于你的答案,我的问题恰恰是避免系统地这样做。我会选择@myusuf的答案,并补充说它必须在更新前使用,这是我仍然可以将新字段与当前记录中的字段进行比较的唯一地方。但是sails没有提供任何访问beforeUpdate中正在更新的模型的方法,所以我建议使用afterUpdate。我希望@myusuf可以解释缓存,这样可能会有一个解决方案。总之,在beforeUpdate中,无法访问将要更新的模型实例,而在afterUpdate中,无法访问刚刚更新的记录的早期状态。我将把它捆绑到NeedsBazbeUpdate例程中,并在Foo的beforeUpdate中使用它。您能推荐任何关于引用缓存的引用吗?