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

时间:2014-11-28 14:36:48

标签: model-view-controller sails.js lifecycle

我正在使用Sails.js v0.10.5,但这可能适用于更一般的MVC生命周期逻辑(Ruby on Rails?)。

我有两个模型,比如FooBaz,与一对一关联相关联。 每次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对象。效率低下?次优?

2 个答案:

答案 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内部定义,生命周期回调在外面。