2017-08-20 1 views
0

Ich brauche Hilfe beim Erstellen einer Firebase-Datenbankregel. Der Anwendungsfall ist so: Der Benutzer (Gamer) hat 3 Schatzkisten, die jeden Schatz aufnehmen können. Benutzer kann zusätzliche Schatzkiste kaufen. So ist die Baumstruktur in Feuerbasis Datenbank kam ich ist:FireBase-Datenbankregel für Schlüsselname erstellen

user 
    |- settings 
     |- max-t-box : 3 
    |- boxes 
     |- 1 : {} // a complicated data for the treasure or null 
     |- 2 : {} // a complicated data for the treasure or null 
     |- 3 : {} // a complicated data for the treasure or null 

Die Regel auf ‚Benutzer/Einstellungen/Max-T-Box‘ ist trivial: Benutzer nur lesen und nicht schreiben darf (es kann nur geändert werden, von serverseitigem Admin).

Die Regel unter 'user/boxes' soll sein: Der Schlüssel der neuen Daten sollte eine Zahl sein und sein Wert sollte> 0 und < = 'user/setting/max-t-box' sein.

Laut Firebase-Dokument kann ich $ Variable verwenden, um Pfadsegment zu erfassen, aber es bietet nicht genügend API für mich, den Pfad Knoten Name Wert zu überprüfen.

Bisher habe ich die Lösung gefunden, Regeln für den Pfad 'user/boxes/1', 'user/boxes/2' und 'user/Boxes/3' zu schreiben. Allerdings sieht das wirklich blöd aus, nachdem der Benutzer viele Kisten gekauft hat.

Antwort

1

Sie werden in eine Los Probleme mit sequenziellen Nummern als Schlüssel laufen. Sie können (können) wie ein Array behandelt werden und in Firebase Arrays Are Evil und sollten in der Regel vermieden werden.

Arrays können nicht geändert, gesucht werden und wenn Sie sie ändern möchten, müssen sie komplett neu geschrieben werden.

Strukturierung Ihrer Daten-Push() oder childByAuto() Ihre Schlüssel zu erstellen, ist der Weg zu gehen:

root 
    settings 
     max-t-box 3 

    boxes 
     -yuy8jj09j9090f 
     box_num: 1 
     box_name: "Big box" 
     box_location: "Sewer" 
     -y8jokokoais9g 
     box_num: 2 
     box_name: "Small box" 
     box_location: "Tower" 

und dann sind die Regeln ein Kinderspiel

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null", 
    "boxes": { 
     "$box_num": { 
     ".validate": "newData.child('box_num').val() > 0 && 
         newData.child('box_num').val() <= 
             root.child('settings').child('max-t-box').val()" 
     } 
    } 
    } 
} 

ich dies direkt tat innerhalb des Root-Knotens, aber Sie können root.child ('users') für Ihre Firebase-Struktur ersetzen.

+0

Vielen Dank für die Post und die Antwort! Ich denke, wir müssen uns ein bisschen dazu überwinden, auf Firebase-Art zu denken. – Nathan

Verwandte Themen