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