2013-03-14 9 views
12

Powiedzmy, że person może mieć wiele numerów cars, a car może mieć wiele adresów accidents. Można więc mamy:Jak obsługiwać puste tablice w Firebase?

# Person with no cars 
person: 
    name: "Misha" 
    cars: [] 

# Person with free-accident car 
person: 
    name "Arlen" 
    cars: 
    0: 
     name: "Toyota" 
     accidents: [] 

Firebase przechowuje te osoby jak:

person: 
    name: "Misha" 

i

person: 
    name "Arlen" 
    cars: 
    0: 
     name: "Toyota" 

więc w JavaScript mam zrobić następujące czynności, aby przywrócić pustych tablic (coffeescript)

if person.cars? 
    for car in person.cars 
    car.accidents = [] unless car.accidents? 
else 
    person.cars = [] 

Czy istnieje lepszy sposób na obsługę pustych tablic w Firebase bez pisania tego niepotrzebnego kodu JavaScript?

Odpowiedz

13

Myślę, że jeśli zrozumiem podstawowe pytanie, krótka odpowiedź brzmi, że nie ma sposobu na wymuszenie pustej tablicy w bazie Firebase. Istnieją jednak paradygmaty, które mogą działać lepiej niż to, co masz powyżej.

Należy pamiętać, że Firebase to środowisko działające w czasie rzeczywistym. Liczba samochodów i wypadków może (i będzie) zmieniać się w każdej chwili. Najlepiej traktować wszystko jako nowe dane docierające w czasie rzeczywistym i unikać nawet myślenia o istnieniu lub nie istnieje.

// fetch all the people in real-time 
rootRef.child('people').on('child_added', function(personSnapshot) { 

    // monitor their cars 
    personSnapshot.ref().child('cars', 'child_added', function(carSnapshot) { 

     // monitor accidents 
     carSnapshot.ref().child('accidents', 'child_added', function(accidentSnapshot) { 
      // here is where you invoke your code related to accidents 
     }); 
    }); 
}); 

Uwaga: nie ma potrzeby stosowania logiki typu if exists/unless. Zauważ, że prawdopodobnie będziesz również chciał monitorować child_removed na cars i people i zadzwonić pod numer ref.off(), aby zatrzymać odsłuchiwanie określonych dzieci.

Jeśli z jakiegoś powodu chcesz trzymać z modelu statycznego, następnie forEach staną się twoim przyjacielem:

// fetch all the people as one object, asynchronously 
// this won't work well with many thousands of records 
rootRef.child('people').once('value', function(everyoneSnap) { 

    // get each user (this is synchronous!) 
    everyoneSnap.forEach(function(personSnap) { 

     // get all cars (this is asynchronous) 
     personSnap.ref().child('cars').once('value', function(allCars) { 

      // iterate cars (this is synchronous) 
      allCars.forEach(function(carSnap) { /* and so on */ }); 

     }); 

    }); 
}); 

Uwaga sposób, nawet z foreach nie ma potrzeby „istnieje lub że” coś w rodzaju logika.

+0

Wielkiej odpowiedzi Kato! –

4

Zwykle używam numChildren funkcyjnych DataSnapshot(), aby sprawdzić, czy nie ma w niej nie podoba Ci się to

var fire = new Firebase("https://example.firebaseio.com/"); 
fire.once('value', function(data){if (data.numChildren() > 0){ /*Do something*/ }); 
Powiązane problemy