2016-01-29 14 views
7

So che questo argomento è già stato discusso su StackOverflow e altri forum, ma non riesco a trovare il modo giusto per farlo.Salvataggio di più modelli contemporaneamente, in blocco

Ho un modello chiamato "post" che contiene informazioni sul post (utente, descrizione, ecc ...). L'utente riceve pochi post, li legge e fa azioni su di loro. I post provengono dalla mia api quando richiedo un GET /api/posts/

Ho anche un modello chiamato "post-stato" in cui salva l'azione delle persone che leggono il post: quando gli piace, condividi, vota o preferisce il inviare.

export default DS.Model.extend({ 
    post: belongsTo('post'), 
    user: belongsTo('user'), 
    liked: attr('boolean', { defaultValue: false }), 
    favourited: attr('boolean', { defaultValue: false }), 
    voted: attr('boolean', { defaultValue: false }), 
    shared: attr('boolean', { defaultValue: false }), 
}); 

Sto cercando un modo per la mia applicazione brace per salvare i miei modelli post-statali in una massa, proprio come ho ricevuto il messaggio in una massa pure. Gli stati postali verrebbero salvati con una chiamata API POST /api/post-states/

Ho letto in una discussione che il modo migliore sarebbe quello di creare un adattatore personalizzato, ma non sono sicuro di cosa mettere in esso per essere in grado di fallo ... forse per creare una funzione saveAllRecords()?

Quale sarebbe la soluzione migliore per me?

Grazie per il vostro aiuto!

+1

Mai guardato questo: http://emberjs.com/api/data/classes/DS.Store.html#method_pushPayload O un array di record puoi .invoke ('save') [non so se questo è tutto con una sola pressione. Potrebbe essere necessario sostituire il negozio.scheduleSave] – Hillboy

risposta

1

Si può vedere come lo fa ember-api-actions. Controlla i numeri build-url e one dei file che contengono il metodo per effettuare la chiamata ajax. In pratica puoi copiare i metodi e usarli nel tuo modello. Ma penso che sarebbe più semplice usare l'addon a questo punto :)

+0

Ho dato un'occhiata a questo addon e non sono un grande fan del modo in cui è stato realizzato, in realtà non risponde alle mie esigenze. – alexmngn

1

Mi sono guardato intorno e sembra che non ci sia un modo corretto per farlo con Ember, ma ho trovato qualcosa che ho non sono sicuro di quanto sia il modo Ember. Quello che puoi fare è creare un modello diverso che contenga un attributo che conterrà i modelli che desideri salvare in massa, quindi aggiungere tali modelli al modello contenitore e puoi giocare con il serializzatore/adattatore per ottenere ciò che desideri. Ecco come funzionerebbe:

modello (consente di chiamare post-state-container)

import DS from 'ember-data'; 

export default DS.Model.extend({ 
    postStates: DS.hasMany('post-state') 
}); 

Serializer

import DS from 'ember-data'; 
import Ember from 'ember'; 

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, { 
    attrs: { 
    postStates: { embedded: 'always' }, 
    }, 
    serializeIntoHash: function(data, type, record, options) { 
    Ember.$.extend(data, this.serialize(record, options)); 
    } 
}); 

Si può massaggiare il payload inviato al server qui per adattarsi a quello che vi serve per la vostra backend, perché si otterrà un elenco di oggetti serializzati post-state in formato JSON da this.serialize(record, options)

Adattatore

import DS from 'ember-data'; 

export default DS.RESTAdapter.extend({ 
    namespace: 'api', 
    urlForCreateRecord: function() { 
    return this.get('namespace') + '/post-states'; 
    }, 
}); 

come usarlo (probabilmente e azione in un percorso o un controller da qualche parte)

let record1 = this.store.createRecord('post-state'); //These would be your populated records 
    let record2 = this.store.createRecord('post-state'); //These would be your populated records 
    let postStateContainer = this.store.createRecord('post-state-container'); 
    postStateContainer.get('post-state-container').pushObject(record1); 
    postStateContainer.get('post-state-container').pushObject(record2); 
    postStateContainer.save(); 

Ho provato questo, e funziona. Non sono sicuro se c'è un modo migliore di usare JSONApi o qualcosa del genere

+0

Volevo davvero evitare di farlo anche se ... – alexmngn

Problemi correlati