Сохраните счет, когда вы идете, и используйте валидацию для его принудительного применения. Я взломал это вместе - за счет подсчета уникальных голосов и подсчетов, которые продолжают расти! Но на этот раз я опробовал свое предложение! (несмотря на ошибки вырезания / вставки!).
Здесь «трюк» должен использовать узел priority в качестве количества голосов ...
данные:
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()"
пользователь может голосовать только один раз & amp; & amp; & amp; счет должен быть выше, чем текущий счетчик & amp; & amp; значение данных должно быть таким же, как и приоритет.
}
}
,"count" : {
".validate" : "data.parent().child(newData.val()).val()==newData.getPriority() &&
newData.getPriority()==data.getPriority()+1 "
}
count (последний избиратель действительно) - голос должен существовать и его счет равен newcount, & amp; & amp; newcount (priority) может подниматься только на один.
}
}
Тестовый скрипт для добавления 10 голосов разными пользователями (для этого примера фальшивка id должна быть выполнена пользователем auth.uid в процессе производства). Counting by (i--) 10, чтобы увидеть, что проверка не выполнена.
<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>
Здесь «риск» заключается в том, что голосование выполняется, но счет не обновляется (сбой или сбой сценария). Вот почему голоса имеют уникальный «приоритет» - сценарий должен действительно начинаться с того, что нет голоса с приоритетом выше текущего счета, если он должен завершить эту транзакцию, прежде чем делать это самостоятельно - попросите своих клиентов очистить для вас:)
Счет должен быть инициализирован с приоритетом перед запуском - forge не позволяет вам это делать, поэтому необходим скрипт-заглушка (до того, как валидация будет активна!).