5

セキュリティ ルールを使用して、ノードの子の最大数を強制するにはどうすればよいですか?

/bar/customers/$customer/drinks_ordered

15人を超える子供を持つべきではありません。

4

1 に答える 1

5

注文した飲み物に数値IDを使用して、次のように試すことができるように思われるかもしれません。IDは文字列であるため、失敗します。

"$customer_id": {
    "drinks_ordered": {
       "$drink_id": {
          ".validate": "$drink_id > 0 && $drink_id < 16" // error
       }
    }
}

代わりに、カウンターを使用してカウンターが1〜15であることを検証してから、飲み物IDがカウンターと一致することを検証できます。

"$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"
       }
    }
}

当然、あなたの飲み物は次のようになります。

 /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

クライアントが別の飲み物を追加する前に、カウンターを4(設定できる唯一のもの)に設定してから、同じIDで飲み物を追加する必要があります。

少し回り道ですが、それは仕事をします:)

于 2013-02-17T20:41:27.253 に答える