Sails.jsのmodelのintな値をインクリメントしたい


たとえばCounterというmodelを

[code]

    module.exports = {
      attributes = {
        count: 'INT'
      }
    }
    
[/code]

として用意して、

[code]

    Counter.create({count: 10})
    
[/code]

を実行すると、

[code]

    { count: 10,
      createdAt: Sat Jan 24 2014 17:12:18 GMT+0900 (JST),
      updatedAt: Sat Jan 24 2014 17:12:18 GMT+0900 (JST),
      id: 1 }
    
[/code]

のようなmodelが作成され、

[code]

    Counter.update({id: 1},{count: 11})
    
[/code]

を実行すれば、上のmodelのcountを11に変更することができますが、  
これを値を確認せずにインクリメントする方法はないのでしょうか？




**追記: 前回のコード、コールバック指定していないところがあったので、更新しました。すいません (1/26)**

モデルにクラスメソッドを定義して呼び出してやるのが良い。

_models/Counter.js_

[code]

    module.exports = {
      attributes: {
        count: 'INT'
      },
      increment_count: function( query, cb) {
        Counter.findOne(query).exec(function(err, res) {
          Counter.update(query,{count: ++res.count}).exec( cb);
        });
      },
    };
    
[/code]

_controllers/CounterController.js_

[code]

    module.exports = {
      init: function (req, res) {
        Counter.findOne(1).exec(function(err, cnt) {
          if (err) {
            res.send("error")
            return;
          }
          if ( cnt) {
            cnt.count = 0;
            Counter.update(1, cnt).exec(function(err, newCnt) {
              res.send("Counter has been reset.");
            });
          } else {
            Counter.create({id:1, count: 10}).exec(function(err, newCnt){
              res.send("new Counter has been created.");
            });
          }
        })
      },
    
      increment: function (req, res) {
        # {id:1} のカウンタを 1 上げる
        Counter.increment_count(1, function( err, cnt) {
          return res.send( cnt);
        });
      }
    };
    
[/code]

  * <http://localhost:1337/counter/init> にアクセスでカウンタ初期化
  * <http://localhost:1337/counter/increment> にアクセスでカウントアップ




**追記: 前回のコード、コールバック指定していないところがあったので、更新しました。すいません (1/26)**

モデルにクラスメソッドを定義して呼び出してやるのが良い。

_models/Counter.js_

[code]

    module.exports = {
      attributes: {
        count: 'INT'
      },
      increment_count: function( query, cb) {
        Counter.findOne(query).exec(function(err, res) {
          Counter.update(query,{count: ++res.count}).exec( cb);
        });
      },
    };
    
[/code]

_controllers/CounterController.js_

[code]

    module.exports = {
      init: function (req, res) {
        Counter.findOne(1).exec(function(err, cnt) {
          if (err) {
            res.send("error")
            return;
          }
          if ( cnt) {
            cnt.count = 0;
            Counter.update(1, cnt).exec(function(err, newCnt) {
              res.send("Counter has been reset.");
            });
          } else {
            Counter.create({id:1, count: 10}).exec(function(err, newCnt){
              res.send("new Counter has been created.");
            });
          }
        })
      },
    
      increment: function (req, res) {
        # {id:1} のカウンタを 1 上げる
        Counter.increment_count(1, function( err, cnt) {
          return res.send( cnt);
        });
      }
    };
    
[/code]

  * <http://localhost:1337/counter/init> にアクセスでカウンタ初期化
  * <http://localhost:1337/counter/increment> にアクセスでカウントアップ

