11

Jestem nowy w stosunku do kręgosłupa, nie jestem pewien, jaki jest właściwy sposób używania HasMany.Relacje między-relacyjne i najlepsze praktyki

Mam model Parent, który ma wiele children (przez "wiele" mam na myśli tysiące dzieci). Aby uniknąć problemów z wydajnością, wysyłam zapytanie do dzieci przez ich klucz obcy: /child/?parent=1, zamiast tworzyć ogromną listę child_ids w Parent. Ale wygląda na to, że to nie jest sposób na relokację.

Zastanawiam się, jaki jest właściwy sposób, aby sobie z tym poradzić.

1, Zmień mój json api do listy id dzieci w dominującej obejmują, następnie wysłać tysiące identyfikatorów jako Backbone-relacyjne polecamy:

url = function(models) { 
    return '/child/' + (models ? 'set/' + _.pluck(models, 'id').join(';') + '/' : ''); 
} 
// this will end up with a really long url: /child/set/1;2;3;4;...;9998;9999 

2, zastępują wiele metod w Backbone-relacyjny, to niech sobie ta sytuacja. Moja pierwsza myśl to:

relations: [{ 
    collectionOptions: function(model){ 
    // I am not sure if I should use `this` to access my relation object 
    var relation = this; 
    return { 
     model: relation.relatedModel, 
     url: function(){ 
     return relation.relatedModel.urlRoot + '?' + relation.collectionKey + '=' + model.id; 
     } 
    } 
    } 
}] 
// This seems work, but it can not be inherent by other model 
// And in this case parent will have am empty children list at beginning.  
// So parent.fetchRelated() won't fetch anything, I need call this url my self. 

3, Stosuj tylko relacje szkieletu jako sklep, a następnie użyj kolekcji do zarządzania relacjami.

4, niektóre inne magiczny sposób lub wzór lub szkieletowej ramy

Dzięki za pomoc.

+1

Z mojego doświadczenia z kręgosłupem wynika, że ​​nie będzie dobrze działać z tysiącami modeli. Wystąpiły pewne problemy z wydajnością w setkach modeli - szczególnie podczas ich ładowania. Relacje szkieletowo-relacyjne są dość "rozmowne" ze zdarzeniami wyzwalającymi, a w zależności od tego, ile właściwości masz w swoim modelu, kończy się to tuzinem zdarzeń wystrzeliwanych na model razy tysiące modeli. –

+0

Jestem ciekawa, jak w końcu sobie z tym poradziłeś. –

+0

to jest sposób w jaki ostatecznie używam, niezbyt czysty, ale działa do tej pory. – xzhang

Odpowiedz

1

Oto rozwiązanie, które mam na bieżącym projekcie. Zauważ, że Project ma wiele komentarzy, wydarzeń, plików i filmów. Te relacje i ich relacje odwrotne są określone w tych modelach:

Entities.Project = Backbone.RelationalModel.extend({ 
    updateRelation: function(relation) { 
     var id = this.get('id'), 
      collection = this.get(relation); 

     return collection.fetch({ data: $.param({ project_id: id }) }); 
    } 
}); 

Mam końcowy REST skonfigurowane do podjęcia parametry, które działają jako kolejny „gdzie” klauzule. Tak więc project.updateRelation('comments') wyśle ​​żądanie do /comments?project_id=4 Mam trochę dalszej logiki po stronie serwera, aby odfiltrować rzeczy, których użytkownik nie ma prawa widzieć. (Laravel back-end, btw)