После обновления, как сравнить экземпляр модели с ее прежним состоянием

Я использую 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 объект. Неэффективное? Sub-оптимальный?

2 ответа

Решение

Единственная оптимизация, о которой я мог подумать:

Вы могли бы позвонить 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();
    });
  }
}

В противном случае, как ответил myusuf, если вам нужно обновить только на основе соответствующих полей, то вы можете нажать на него в beforeUpdate Перезвоните.

Кстати, функции экземпляра должны быть определены внутри attributes опора, обратные вызовы жизненного цикла снаружи.

Другие вопросы по тегам