Обновление модели ватерлинии из метода экземпляра

Я использую ORM Waterline для взаимодействия с моей базой данных.

Я расширяю Waterline.Collections на новые объекты и назначаю их модулю:

var Waterline = require('waterline');

var User = Waterline.Collection.extend({
    ...some fields...
    attributes:{
        col_a:{
             type:'integer'
        },
        touch_user:function(){
            //   increment col_a and update in table
        }
    }
});

export = module.exports = User;

Я запрашиваю конкретные модели, которые мне нужно обновить, а затем манипулирую ими в обещании.

database.models.users.findAll().where({'id':1}).then(...model manipulation...)

Есть задача, которую я выполняю часто, почти всякий раз, когда обращаюсь к модели. Я хотел бы инкапсулировать эту задачу в функцию, связанную с экземпляром, чтобы я мог просто вызвать «touch_user», и соответствующие поля будут обновлены для модели, которую я вызываю.

Я не могу получить доступ к методам запроса Waterline (например, .update ()) из экземпляра модели после того, как модель запрошена следующим образом:

database.models.users.findAll().where({'id':1).then((user)=>{
    user.touch_user();
    //user.update    // does not work
});

Но только после запроса я получаю данные, связанные с записью. Я бы хотел, чтобы user.touch_user () увеличивал col_a в таблице пользователей, как показано ниже

database.models.users.findAll().where({'id':1).then((user)=>{
    user.touch_user();
    database.models.users.update(user.id, {'col_a':user.col_a+1});
});

Проблема с вышеизложенным состоит в том, что объект пользователя не точно отражает обновление таблицы.


person Kanembel    schedule 18.12.2016    source источник


Ответы (1)


В итоге я создал метод класса для обновления модели и экземпляра. Не совсем то, что я хочу, но в крайнем случае позволяет синхронизировать модель и таблицу.

var User = Waterline.Collection.extend({
    ...some fields...
    attributes:{
         col_a:{
              type:'integer'
         },
     },
     //  touch_user is a class method here
     touch_user:function(user){
         // update model instance
         user.col_a += 1;
         // update database table
         database.models.users.update(user.id, {'col_a':user.col_a).exec(function(){});
     }
});

Называется так

database.models.users.findAll().where({'id':1).then((user)=>{
    ...modify user...
    database.models.users.touch_user(user);

    ...other changes to user that have to occur here...
    database.models.users.touch_user(user);
});
person Kanembel    schedule 15.01.2017