2016-12-18 4 views
0

私はウォーターラインORMを使用して自分のデータベースとインターフェイスしています。インスタンスメソッドからウォーターラインモデルを更新する

私は新しいオブジェクトに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」と関連するフィールドが呼び出されたモデルのために更新されます。モデルはそのように照会された後

私はモデルインスタンスから(例えば.update()など)ウォーターラインクエリメソッドにアクセスすることはできませんよ。

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

をしかし、私はそれを照会するまでそうではないことレコードに関連付けられたデータを取得します。 Iは、上記の問題は、ユーザオブジェクトが正確にテーブルの更新を反映していないことである以下

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

と同様ユーザーテーブル内col_aをインクリメントする)(user.touch_userを希望。

答えて

0

最後に、モデルとインスタンスを更新するクラスメソッドを作成しました。ない、まさに私が欲しいが、それはそう

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); 
}); 
などと呼ば

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(){}); 
    } 
}); 

を同期モデルとテーブルを維持するために、ピンチでありません

関連する問題