2014-07-18 45 views
1

使用Firebase安全規則,如何檢查兄弟值以確定newData是否有效?如何在Firebase規則中使用未知鍵檢查現有數據的值?

在我的應用程序中,每個game都有moves的列表。遊戲在這裏1405584062293

http://i.imgur.com/Eu4B1Qt.png

當一個新的舉措被提交,我想參照已經被播放的移動來驗證它。對於初學者來說,玩家應該只能夠每秒進行一次移動(玩家可以從索引0開始進行移動,玩家2可以進行奇數移動)。

由於每個動作的關鍵是一個未知的隨機字符串(根據this recommendation in the docs),我不知道如何檢查以前的舉動。我也不知道如何計算現有舉措的數量。

這裏是我的結構:

{ 
    "rules":{ 
    ".read":true, 
    "games":{ 
     "$game":{ 
     "moves":{ 
      "$move":{ 
      ".write":"auth !== null", 
      // Something along these lines would get me going... 
      ".validate":"data.parent().keys.count % 2 == 0" 
      } 
     } 
     } 
    } 
    } 
} 

在現實中,遊戲規則要複雜得多,我想我會需要使用火災安全或類似的解決方案,但現在我想知道如何實現這些和其他這樣簡單的規則。

回答

1

並非每個用例都適合用於管理通用列表的單一推薦方法。當然不是你的。您可能會在an incremental ID的方法中找到更多的使用方法。

由於您無法對子記錄鍵/值進行包含,因此您將保留一個可遞增的值。例如,利用上面的增量ID的方法,然後我可以寫一個安全規則,以確保我寫奇鍵(只有在輪到我了)如下:

".validate": "((root.child('counter').val()||0)+1) % 2 === root.child('users').child(auth.uid).child('evenOrOdd').val()" 
+0

感謝您的協助!我實際上最終通過簡單地選擇移動的id('move-0','move-1','move-2'...)來解決我的問題,並且因爲假設玩家將擁有完整的遊戲的移動列表不需要計數器。一切都在工作。 – doctororange

0

只要您不撤消移動(例如,從Firebase中的列表中移除移動),將其存儲爲數組(imo)沒有任何問題。

如果您從數組中移除某個元素,則會出現問題,因爲這樣索引中的數字將被跳過,並且Firebase不再將其視爲數組,而是將其視爲數組。

+1

有[幾個原因陣列可能是不好的選擇](https://www.firebase.com/blog/2014-04-28-best-practices-arrays-in-firebase.html),並且包括由多個用戶同時編輯的任何數據。這並不像從不刪除那麼簡單。 – Kato

+0

你說得對。優雅的解決方案! – ArneHugo

相關問題