Model view controller 更新时,如何将模型实例与其以前的状态进行比较

Model 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

我使用的是Sails.jsv0.10.5,但这可能适用于更通用的MVC生命周期逻辑rubyonrails

我有两个模型,比如Foo和Baz,它们通过一对一的联系联系在一起。 每次Foo实例中的数据发生更改时,都必须对Baz模型实例执行一些繁重的操作,如下面所示的costlyRoutinemethod

// 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中使用它。您能推荐任何关于引用缓存的引用吗?