embedded
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親のもの。
編集:私の実際のユースケース
1-マスターからemberデータを作成しました
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();
_
a POST for joincolumnが送信され、親がダーティではない
何が足りないのですか?
私はまったく同じ問題を抱えています。
このバグはemberデータ問題トラッカーで報告されています。次のPRは、問題を示す2つの失敗したテストを追加します: https://github.com/emberjs/data/pull/ 578
現在、回避策はないようです。
編集:
sebastianseilundは2日前にPRを開始し、問題を解決しました。ご覧ください: https://github.com/emberjs/data/pull/629/files
マスターでは、正しいAPIは次のとおりです。
App.Adapter.map('App.Post', {
comments: { embedded: 'always' }
});
embedded
の2つの可能な値は次のとおりです。
load
:子レコードはロード時に埋め込まれますが、スタンドアロンレコードとして保存する必要があります。これが機能するためには、子レコードにIDが必要です。always
:子レコードはロード時に埋め込まれ、同じレコードに埋め込まれて保存されます。もちろん、これはレコードのダーティに影響します(子レコードが変更された場合、アダプタは親レコードをダーティとしてマークします)。カスタムアダプタがない場合は、DS.RESTAdapter
で直接map
を呼び出すことができます。
DS.RESTAdapter.map('App.Post', {
comments: { embedded: 'always' }
});
他の人がこの投稿に出くわし、現在のバージョンのember-dataで何が機能するかを理解するのに苦労している場合に備えて、これに更新を追加します。
Ember Data 1.0.0.beta.7の時点で、シリアライザーの適切なメソッドをオーバーライドする必要があります。例を次に示します。
1)シリアライザーを再度開きます(クレジット この投稿 ):
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'
オプションを追加します。
App.Post = DS.Model.extend({
comments: DS.hasMany('comment', {
embedded: 'always'
})
});
これは私のために働いたものです(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' }
}
});