2016-04-30 2 views
0

bookshelf.jsを使用して、私はオブジェクトのセットを取得し、それらをすべて更新しようとしています。Bookshelf.js、fetchAll()メソッドの後に更新

私はBookshelf.jsで達成しようとしている何
function markPostsAsSent(postsIds) { 
    return new Promise((resolve, reject) => { 
     // Get posts 
     Search.Post 
     .where({ id: postsIds }) 
     .fetchAll() 
     .then(posts => { 
      // For each post, update sent value 
      Promise.map(posts.toJSON(), post => post.save({ is_sent: true })) 
      .then(() => { 
       resolve(true); 
      }, err => { 
       reject(Dependencies.getException(exceptionName, 500, 'POST_UPDATE_ERROR', new Error(), err)); 
      }); 
     }, err => { 
      reject(Dependencies.getException(exceptionName, 500, 'POST_FETCH_ERROR', new Error(), err)); 
     }); 
    }); 
} 

は、SQLでこれに相当します。

UPDATE searches_posts 
SET is_sent = true 
WHERE id IN (1, 2, 3, 4); 

(1, 2, 3, 4)は明らかにpostsIdsパラメータの値です。

SQLは、Bookshelf.jsメソッドよりもはるかに単純です。

.save()メソッドをループするのではなく、これらの行をすべて同時に更新する方が良いですか?

答えて

1

あなたのソリューションは固いようですが、もちろん、より良い方法があります。 たとえば、更新を実行することを明示的に指定することができます(http://bookshelfjs.org/#Model-instance-save).Nextクエリビルダを使用して、更新するエントリを制限することができます(http://knexjs.org/#Builder-whereIn)。このことができます

new Person().query(function(qb) { 
    qb.whereIn('id', [2, 4]); 
}).save({ 
    number_of_children: 5 
}, { 
    method: 'update' 
}).then(function() { 
    //Entries with ids 2 and 4 have been updated! 
}); 

希望:

だから、一緒にすべてを入れて、(これは私が解決策をテストするために行われ、いくつかのデモの例である)このような何かを試してみてください!

+0

ありがとうございました!これは最高です! – DeadEye

0

更新/挿入はどうですか?これを行うより雄弁な方法は何ですか?

yield Promise.map data, (oneEvent)-> 
    eventModel = new Event oneEvent 

    eventModel.fetch().then (fromDB) -> 
    return do eventModel.save if not fromDB? 
    fromDB.save oneEvent 
+0

このES6は互換性がありますか? – DeadEye

関連する問題