可以使用.validate指令来同步Firebase中的架构吗?

时间:2013-09-17 09:40:10

标签: firebase

在Firebase安全规则文件中,是否可以有效地使用“.validate”指令来同步架构,也就是说,确保在修改Firebase的某个部分时,另一部分也会更新?或者这是一个糟糕/无效的想法?

基本上我要做的是创建一个Todo列表应用程序。我希望能够使用指定的标签在我的待办事项列表中创建任务。对于应用中的每个代码,我的Firebase后端的“代码”字段中应该有相应的代码子字段。标记字段应包含“任务”字段中任务的引用的有序列表。因此,如果使用“#foo”标记创建任务,则应在“tasks / foo”中引用其名称(id)。此外,每当删除任务时,应删除每个标记中的引用,当标记中没有子项时,应将其删除。

这里是一个模式的例子:

{
    "tasks": {
        "-sdjfaowneono": {
            "headline": "Get some milk",
            "completed": false,
            "tags": {
                "0": "all",
                "1": "shopping"
            }
        },
        "-asdfhsadfsafwirn": {
            "headline": "Pick up the kids",
            "completed": false,
            "tags": {
                "0": "all"
            }
        }
    },
    "tags": {
        "all": {
            "0": "-sdjfaowneono",
            "1": "-asdfhsadfsafwirn"
        },
        "shopping": {
            "0": "-sdjfaowneono"
        }
    }
}

同样,如果删除了“-sdjfaowneono”任务,那么“shopping”标签也会被删除。

总之,我需要以特定方式将“标签”架构与“任务”架构同步。我应该在安全规则中执行此同步吗?或者我应该在应用程序级别执行此操作?如果我在应用程序级别执行此操作,则存在应用程序错误并且不添加/删除应该标记的风险,那么我该如何克服该问题呢?

1 个答案:

答案 0 :(得分:0)

要将此与安全规则一起使用,您需要更改其中一个以使用标记ID作为键,而不是数组值,因为无法指定通配符或搜索多个子项以查看如果一个包含正确的值。

因此,如果您将“标记”路径更改为如下所示:

"tags": {
   "all": {
      "-sdjfaowneono": true,
      "-asdfhsadfsafwirn": true
   },
   "shopping": {
       "-sdjfaowneono": true
   }
}

然后你可以这样验证:

"tasks": {
   "$task": {
      "tags": {
         "$tag": {
             ".validate": "root.child('tags/'+newData.val()+'/'+$task).exists()"
         }
      }
   }
}

这揭示了我在使用Firebase构建时发现的基本设计实践:我倾向于使用键来存储任何类型的外键引用的值。

另外,请记住,这只会强制它们在写入时匹配。它确实有助于删除,因为.validate只有在值存在时才会运行。

您可以通过将此附加到写入规则来对删除执行相同的行为:

".write": " ... && (newData.exists() || !root.child('tags/'+newData.val()+'/'+$task).exists())"