Enregistrez le décompte au fur et à mesure et utilisez la validation pour l'appliquer. J'ai piraté cela ensemble - pour garder un décompte des votes uniques et des décomptes qui ne cessent de monter !. Mais cette fois, j'ai testé ma suggestion! (nonobstant les erreurs de copier / coller!).
Le `` truc '' ici est d'utiliser la priorité du nœud comme compte de vote ...
Les données sont:
vote / $ issueBeingVotedOn / user / $ uniqueIdOfVoter = thisVotesCount, priority = thisVotesCount vote / $ issueBeingVotedOn / count = 'user /' + $ idOfLastVoter, priority = CountofLastVote
,"vote": {
  ".read" : true
  ,".write" : true
  ,"$issue" : {
    "user" : {
      "$user" : {
        ".validate" : "!data.exists() && 
             newData.val()==data.parent().parent().child('count').getPriority()+1 &&
             newData.val()==newData.GetPriority()" 
l'utilisateur ne peut voter qu'une seule fois && le compte doit être supérieur de un au nombre actuel et la valeur des données doit être identique à la priorité.
      }
    }
    ,"count" : {
      ".validate" : "data.parent().child(newData.val()).val()==newData.getPriority() &&
             newData.getPriority()==data.getPriority()+1 "
    }
count (dernier votant vraiment) - le vote doit exister et son compte est égal à newcount, && newcount (priorité) ne peut augmenter que de un.
  }
}
Script de test pour ajouter 10 votes par différents utilisateurs (pour cet exemple, id est falsifié, devrait l'utilisateur auth.uid en production). Compte à rebours de (i--) 10 pour voir l'échec de la validation.
<script src='https://cdn.firebase.com/v0/firebase.js'></script>
<script>
  window.fb = new Firebase('https:...vote/iss1/');
  window.fb.child('count').once('value', function (dss) {
    votes = dss.getPriority();
    for (var i=1;i<10;i++) vote(dss,i+votes);
  } );
function vote(dss,count)
{
  var user='user/zz' + count; // replace with auth.id or whatever
  window.fb.child(user).setWithPriority(count,count);
  window.fb.child('count').setWithPriority(user,count);
}
</script>
Le «risque» ici est qu'un vote est émis, mais le décompte n'est pas mis à jour (piratage ou échec du script). C'est pourquoi les votes ont une `` priorité '' unique - le script doit vraiment commencer par s'assurer qu'il n'y a pas de vote avec une priorité supérieure au décompte actuel, s'il y en a, il doit terminer cette transaction avant de faire la sienne - faites nettoyer vos clients pour vous :)
Le décompte doit être initialisé avec une priorité avant de commencer - forge ne vous permet pas de faire cela, donc un script stub est nécessaire (avant que la validation ne soit active!).