2011-12-31 2 views
3

upVotesBook 모델이 있습니다. Book 인스턴스는 데이터베이스 (MongoDB)에서 쿼리하고 수정 한 다음 저장할 수 있습니다. 사용자가 책을 업 워드하면 upVotes 카운트를 업데이트하고 전체 모델을 다시 서버에 저장합니다.Backbone.js가있는 투표 시스템

문제는 인스턴스가로드되는 시간과 인스턴스가 저장되는 시간 사이에 다른 사람이 투표하면 두 표가 하나의 투표로 저장된다는 것입니다. 필요한 것은 "하나의 클라이언트 측에서 모델을 증가시키고 충돌이 없기를 바란다"대신 "1 서버 측에서 모델 증가"라고 말하는 쉬운 방법입니다.

+0

나는 정확히 똑같은 문제에 부딪쳤다. 좋은 질문입니다. –

답변

11

한 가지만 바꾸려면 서버에 전체 모델을 저장할 필요가 없습니다. 모델에 upVote 메서드를 추가 할 수 있습니다 (이 경우에는 "upvotes"증가 AJAX 호출을 모델에 추가 할 수 있습니다). 섬기는 사람. 모델에서는이 같은 거라고 :

upVote: function() { 
    var self = this; 
    $.ajax({ 
     url: '/some/upvote/path', 
     type: 'POST', 
     success: function(data) { 
      self.set('upVotes', data.upVotes); 
     }, 
     // ... 
    }); 
} 

를 다음보기는 upvote에 작업을 처리하는 방법이있을 것입니다 :

upVote: function() { 
    // Highlight the upvote button or provide some other feedback that 
    // the upvote has been seen. 
    this.model.upVote(); 
} 

그리고 당신은 아마에 변경 이벤트에 대한 리스너이있을 것이다 모델의 upVotes 속성을 올바르게 표시하는 upvote 카운터 (만약 당신이 그런 일이 있다면).

또한 서버의 은 MongoDB에 $inc update을 보내면 서버에서 동일한 "두 가지 일이 동시에 발생합니다"라는 문제를 피할 수 있습니다. 관계형 데이터베이스를 사용하는 경우 update t set upvotes = upvotes + 1 where id = ?과 같은 작업을 수행해야합니다.

간단한 증분 작업을 위해 클라이언트 또는 서버에서 "쿼리, 업데이트, 저장"왕복이 필요하지 않습니다. 대신 증분을 단일 증분 작업으로 처리하고 해당 증분을 최종 영구 데이터 저장소 계층까지 밀어 넣으십시오.

관련 문제