11

Sono nuovo di backbone relazionale, non sono sicuro di quale sia il modo giusto di usare HasMany.Backbone-relational hasmany best practice

Ho un modello Parent che ha molti children (da "molti" intendo migliaia di bambini). Per evitare problemi di prestazioni, chiedo ai bambini la loro chiave esterna: /child/?parent=1, invece di creare un elenco enorme di child_ids in Parent. Ma sembra che questo non sia il modo in cui funziona il backbone relazionale.

Quindi mi chiedo quale sia il modo giusto per gestire questo.

1, Change my JSON API per includere elenco di id bambino nel genitore, quindi inviare migliaia di ids come colonna portante-relazionale consiglia:

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, eseguire l'override molti metodo Backbone-relazionale, diciamo maneggia questa situazione. Il mio primo pensiero è:

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, utilizzare solo Backbone-relazionale come un negozio, quindi utilizzare Collezione di gestire i rapporti.

4, qualche altro modo la magia o un motivo o spina dorsale quadro

Grazie per l'aiuto.

+1

Nella mia esperienza con backbone-relazionale, non penso che funzionerà bene con migliaia di modelli. Ho avuto alcuni problemi di prestazioni significativi con centinaia di modelli, specialmente quando li ho caricati. Backbone-relational è abbastanza "chiacchierone" con gli eventi di attivazione e, a seconda di quante proprietà hai nel tuo modello, finisce per essere decine di eventi licenziati per modello per migliaia di modelli. –

+0

Sono curioso di sapere come alla fine hai gestito questo. –

+0

questo è il modo in cui uso, non molto pulito, ma funziona così lontano. – xzhang

risposta

1

Ecco la soluzione che ho in corso sul mio progetto attuale. Notare che Project ha molti commenti, eventi, file e video. Quelle relazioni e le loro relazioni inversa sono definiti su quei modelli:

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 }) }); 
    } 
}); 

ho l'endpoint REST configurato per prendere i parametri che agiscono come successivi "dove" clausole. Quindi, project.updateRelation('comments') invierà una richiesta a /comments?project_id=4 Ho qualche ulteriore logica sul lato server per filtrare cose che l'utente non ha il diritto di vedere. (Laravel back-end, btw)