2013-01-14 7 views
17

embeddedhasManyをemberデータで正しく動作させることができません。組み込みのhasManyリレーションシップをemberデータで使用する方法

私はこの

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

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

そして、私のAPIのようなものを持っているがGET /postために次の値を返します。

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

私はPOST /postでこれを送信する必要があります。

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

私がしたいですEmberモデルと連携し、適切な要求をしてください:

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 

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

私はpost: DS.hasMany('App.Post', {embedded: true})ような何かをしようとすると、GETは機能していますが、POSTは、親のものではない2つのだけのレコードのPOSTをしようとしています。

EDIT:私の本当のユースケース

1 - 私はちょうどマスター

2-マイアダプタを燃えさしデータを構築しました:RESTAdapter

、3-シリアライザ:JSONSerializer

4 - 私は追加しました

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

5-マイモデルがあります:

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時:

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

joincolumnためのPOSTが送信され、親が汚れていない

私は何をしないのですか?

+0

他の人これを読んで、見てみましょう:http://www.vinay.io/static/blog/2013/12_17.html – Vinay

答えて

7

私は正確に同じ問題を抱えています。

このバグは、データの問題追跡ツールで報告されています。 次のPRは問題を示す2つの失敗したテストを追加します:https://github.com/emberjs/data/pull/578

今すぐ回避策はありません。

EDIT:

sebastianseilundはあなたの問題を解決した2日前にPRをオープンしました。 次を参照してください:https://github.com/emberjs/data/pull/629/files

46

マスターでは、正しいAPIは次のとおりです。embedded

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

2つの可能な値は以下のとおりです。

  • load:子レコードをロードするときに埋め込まれているが、スタンドアロンのレコードとして保存する必要があります。これを実行するには、子レコードにIDが必要です。
  • always:子レコードは、読み込み時に埋め込まれ、同じレコードに埋め込まれて保存されます。これはもちろん、レコードの汚れに影響を与えます(子レコードが変更された場合、アダプタは親レコードをダーティとマークします)。

カスタムアダプタを持っていない場合は、DS.RESTAdapterに直接mapを呼び出すことができます。

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

これはbelongsToと同じですか? – ken

+0

はい。埋め込み済みのbelongsToと同じAPIです。 –

+1

埋め込まれたレコードを永続化するとバグが発生する可能性があります。https://github.com/emberjs/data/pull/578 – sandstrom

5

この更新プログラムを追加すると、このポストに出くわし、現在のバージョンのember-dataで動作するものを把握するのに苦労しています。

Ember Data 1.0.07では、シリアライザの適切なメソッドをオーバーライドする必要があります。

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)がモデル上の関係にembedded: 'always'オプションを追加します:

1)シリアライザを再度開きthis postへ(クレジット):ここでは一例です

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

これは働いていたものです私のために(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' } 
    } 
}); 
関連する問題