2013-01-14 9 views
17

Nie mogę uzyskać embedded , aby działała poprawnie z danymi embera.W jaki sposób osadzić wiele małych związków Praca z danymi ember

mam coś takiego

App.Post = DS.Model.extend({ 
    comments: DS.hasMany('App.Comment') 
}); 

App.Comment = DS.Model.extend({ 
    post: DS.hasMany('App.Post'), 
    name: attr('string') 
}); 

A mój API zwraca następujące dla GET /post:

[ 
    { 
    id: 1 
    comments: [{name: 'test'}, {name: 'test2'}] 
    }, 
    ... 
] 

muszę wysłać to z POST /post:

[ 
    { 
    comments: [{name: 'test'}, {name: 'test2'}] 
    }, 
    ... 
] 

chcę pracować z modelami Ember i zlecać im odpowiednie żądania:

var post = App.store.createRecord(App.Post, hash_post_without_comments); 
post.get('comments').createRecord(hash_comment); 

App.store.commit(); // This should call the POST api 

i

var posts = App.store.find(App.Post); // This should call the GET api 

Kiedy próbuję coś podobnego post: DS.hasMany('App.Post', {embedded: true}), GET działa ale POST próbuje zrobić post na dwa rekordy nie tylko dominujących jeden.

EDIT: mój prawdziwy przypadek użycia

1- Właśnie zbudowany dane Ember od mistrza

2- Moje adaptera: RESTAdapter

3- serializer: JSONSerializer

4 - Dodałem

App.MyAdapter.map('App.Join', { 
    columns: { embedded: 'always' } 
}); 

5- Moje modele to:

App.Join = DS.Model.extend({ 
    rowCount: DS.attr('number'), 
    columns: DS.hasMany('App.JoinColumn'), 
}); 

App.JoinColumn = DS.Model.extend({ 
    join: DS.belongsTo('App.Join') 
}); 

6- Kiedy:

var a = App.Join.find(1); 
a.get('columns').createRecord({}); 
App.store.commit(); 

POST dla joincolumn jest wysyłany, a rodzic nie jest brudny

Czego mi brakuje?

+0

Ktoś jeszcze czytając to, spójrz: http://www.vinay.io/static/blog/2013/12_17.html – Vinay

Odpowiedz

46

Na pana, prawidłowa API:

App.Adapter.map('App.Post', { 
    comments: { embedded: 'always' } 
}); 

Dwie możliwe wartości embedded są:

  • load: Zapisy dziecka są osadzone podczas ładowania, ale powinny być zapisywane jako samodzielne zapisów . Aby to działało, rekordy podrzędne muszą mieć identyfikator.
  • always: Rekordy podrzędne są osadzane podczas ładowania i są zapisywane w tym samym rekordzie. To oczywiście wpływa na brudność rekordów (jeśli rekord potomny się zmieni, adapter oznaczy rekord nadrzędny jako brudny).

Jeśli nie masz karty niestandardowej można nazwać map bezpośrednio na DS.RESTAdapter:

DS.RESTAdapter.map('App.Post', { 
    comments: { embedded: 'always' } 
}); 
+0

Czy to samo dotyczy również tego? – ken

+0

Tak. Jest to ten sam API dla wbudowanego belongsTo. –

+1

Myślę, że może występować błąd podczas utrwalania osadzonych rekordów, https://github.com/emberjs/data/pull/578 – sandstrom

5

Dodanie aktualizacji do tego incase innych natknąć się na ten post i mają trudności w ustaleniu, co działa z aktualną wersją danych ember.

Począwszy od Ember Data 1.0.0.beta.7, należy zastąpić odpowiednie metody serializera. Oto przykład:

1) Otwórz ponownie serializatora (kredyt do this post):

DS.RESTSerializer.reopen({ 
    serializeHasMany: function(record, json, relationship) { 
    var hasManyRecords, key; 
    key = relationship.key; 
    hasManyRecords = Ember.get(record, key); 
    if (hasManyRecords && relationship.options.embedded === "always") { 
     json[key] = []; 
     hasManyRecords.forEach(function(item, index) { 
     // use includeId: true if you want the id of each model on the hasMany relationship 
     json[key].push(item.serialize({ includeId: true })); 
     }); 
    } else { 
     this._super(record, json, relationship); 
    } 
    } 
}); 

2) Dodaj opcję embedded: 'always' do relacji na modelu

App.Post = DS.Model.extend({ 
    comments: DS.hasMany('comment', { 
    embedded: 'always' 
    }) 
}); 
5

To co pracował dla mnie (Ember 1.5.1 + pre.5349ffcb, Ember Data 1.0.0-beta.7.f87cba88):

App.Post = DS.Model.extend({ 
    comments: DS.hasMany('comment', { embedded: 'always' }) 
}); 

App.PostSerializer = DS.ActiveModelSerializer.extend(DS.EmbeddedRecordsMixin, { 
    attrs: { 
    comments: { embedded: 'always' } 
    } 
}); 
Powiązane problemy