【问题标题】:How can I enforce a maximum number of children in a node?如何强制节点中的最大子节点数?
【发布时间】:2013-02-01 22:05:42
【问题描述】:

如何使用安全规则强制节点的最大子节点数?

/bar/customers/$customer/drinks_ordered

不应有超过 15 个孩子。

【问题讨论】:

    标签: firebase


    【解决方案1】:

    您似乎可以为点的饮料使用数字 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 的饮料。

    有点迂回,但它确实可以完成工作:)

    【讨论】:

    • 我也尝试了第一个示例。支持它会很方便。计数器方法很聪明!
    • 我一直在努力解决这个问题,因为我不断收到关于 .val 无效的错误消息。问题在于验证样本。应该是:` ".validate": "root.child('/bar/customers/' + $customer_id+'/counter').val()+'' == $drink_id"`,对吗?
    • 您也可以将 id 设为用初始零填充的字符串,然后验证 $drink_id >= '00' && $drink_id
    • 我不确定 > 和
    猜你喜欢
    • 2015-06-29
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多