После обновления, как сравнить экземпляр модели с ее прежним состоянием
Я использую 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
опора, обратные вызовы жизненного цикла снаружи.