Jak mogę wymusić maksymalną liczbę dzieci węzła przy użyciu reguły zabezpieczeń?Jak mogę wymusić maksymalną liczbę dzieci w węźle?
/bar/customers/$customer/drinks_ordered
Nie powinien mieć więcej niż piętnaście dzieci.
Jak mogę wymusić maksymalną liczbę dzieci węzła przy użyciu reguły zabezpieczeń?Jak mogę wymusić maksymalną liczbę dzieci w węźle?
/bar/customers/$customer/drinks_ordered
Nie powinien mieć więcej niż piętnaście dzieci.
Może się wydawać, że możesz użyć identyfikatora liczbowego do zamówionych napojów, a następnie spróbuj czegoś takiego; zakończy się niepowodzeniem, ponieważ identyfikator jest ciągiem:
"$customer_id": {
"drinks_ordered": {
"$drink_id": {
".validate": "$drink_id > 0 && $drink_id < 16" // error
}
}
}
Zamiast tego można użyć licznika i zatwierdź licznik się 1-15, a następnie zatwierdź identyfikator napój pasuje licznik.
"$customer_id": {
"counter": {
// counter can only be incremented by 1 each time, must be a number
// and must be <= 15
".validate": "newData.isNumber() && newData.val() > 0 && newData.val() <= 15 && ((!data.exists() && newData.val() === 1) || (newData.val() === data.val()+1))"
},
"drinks_ordered": {
// new record's ID must match the incremented counter
"$drink_id": {
// use .val()+'' because $drink_id is a string and Firebase always uses ===!
".validate": "root.child('bar/customers/'+$customer_id+'/counter').val()+'' == $drink_id"
}
}
}
Naturalnie twoje napoje będzie wyglądać następująco:
/bar/customers/george_thorogood/counter/3
/bar/customers/george_thorogood/drinks_ordered/1/burbon
/bar/customers/george_thorogood/drinks_ordered/2/scotch
/bar/customers/george_thorogood/drinks_ordered/3/beer
Teraz zanim klient może dodać kolejnego drinka, to musiałby ustawić licznik do 4 (która jest jedyną rzeczą, że może ustaw na), a następnie dodaj napój o tym samym ID.
Małe rondo, ale spełnia swoje zadanie:)
Podjęłam również próbę pierwszego przykładu. Byłoby wygodne, gdyby było obsługiwane. Metoda licznika jest sprytna! – abrkn
Zmagałem się z tym, ponieważ ciągle otrzymywałem błąd, że '.val' nie jest ważny. Problem polegał na próbie sprawdzania poprawności. Powinno to być: '" .validate ":" root.child ('/ bar/clients /' + $ customer_id + '/ counter'). Val() + '' == $ drink_id "', prawda? – Justin
Wygląda dobrze, Justin. Dzięki! – Kato