Zapisz count as you go - i użyć go do walidacji egzekwować. Zhackowałem to razem - za utrzymanie liczby unikalnych głosów i liczby, która ciągle nadchodzi !. Ale tym razem przetestowałem moją sugestię! (niezależnie od błędów wycinania/wklejania!).
The 'trik' tutaj jest użycie węzła priorytet jako liczenia głosów ...
Dane są:
głos/$ issueBeingVotedOn/user/$ uniqueIdOfVoter = thisVotesCount, priorytet = thisVotesCount głos/$ issueBeingVotedOn/liczyć '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()"
użytkownik może zagłosować tylko raz & & liczba musi być o jeden większa niż aktualna liczba: & & wartość danych musi być taka sama jak priorytet.
}
}
,"count" : {
".validate" : "data.parent().child(newData.val()).val()==newData.getPriority() &&
newData.getPriority()==data.getPriority()+1 "
}
count (ostatni wyborca naprawdę) - głosowanie musi istnieć, a jego liczba równa newcount, & & newcount (priorytet) może tylko iść w górę o jeden.
}
}
skrypt testowy dodać 10 głosów przez poszczególnych użytkowników (w tym przykładzie, id użytkownika sfałszowane, powinien auth.uid łatwy w produkcji). Odliczaj przez (i--) 10, aby sprawdzić, czy walidacja się nie udała.
<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>
"Ryzyko" polega na tym, że głos jest rzucany, ale liczba nie została zaktualizowana (błąd hakerski lub skryptu). Właśnie dlatego głosy mają wyjątkowy "priorytet" - scenariusz powinien się zacząć od upewnienia się, że nie ma głosowania z priorytetem wyższym niż aktualny, jeśli jest, powinien on zakończyć tę transakcję, zanim zrobi to samodzielnie - poproś klientów, aby wyczyścili dla ciebie :)
Licznik musi zostać zainicjowany z priorytetem przed uruchomieniem - forge nie pozwala tego zrobić, więc potrzebny jest skrypt pośredniczący (przed aktywacją walidacji!).
dziękuję próbuję go i pracował dla mnie –
kod nie może obsłużyć duży zestaw danych. Przyczyna błędu jest spowodowana przez przestrzeń sterty Java. Wciąż czekam na jakąś funkcję. –