Guarde el recuento a medida que avanza y use la validación para aplicarlo. Pirateé esto juntos, ¡por mantener un recuento de votos únicos y recuentos que siguen surgiendo! ¡Pero esta vez he probado mi sugerencia! (¡a pesar de los errores de cortar / pegar!).
El 'truco' aquí es usar la prioridad de nodo como el recuento de votos ...
Los datos son:
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()"
el usuario solo puede votar una vez && count debe ser uno más alto que el conteo actual && el valor de los datos debe ser igual a la prioridad.
}
}
,"count" : {
".validate" : "data.parent().child(newData.val()).val()==newData.getPriority() &&
newData.getPriority()==data.getPriority()+1 "
}
recuento (último votante realmente): el voto debe existir y su recuento es igual al recuento nuevo, y & recuento nuevo (prioridad) solo puede aumentar en uno.
}
}
Pruebe la secuencia de comandos para agregar 10 votos de diferentes usuarios (para este ejemplo, la identificación es falsa, debería usar auth.uid en producción). Cuenta atrás para (i--) 10 para ver la validación falla.
<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>
El 'riesgo' aquí es que se emite un voto, pero el recuento no se actualiza (piratería o falla del script). Esta es la razón por la cual los votos tienen una 'prioridad' única: el guión realmente debería comenzar asegurándose de que no haya un voto con prioridad más alta que el conteo actual, si es que debe completar esa transacción antes de hacer la suya, haga que sus clientes limpien para ti :)
El recuento debe inicializarse con una prioridad antes de comenzar: forge no le permite hacer esto, por lo que se necesita un script de código auxiliar (¡antes de que la validación esté activa!).