1

私は次のモデルを持っています:

App.Offers = DS.Model.extend({
   name: DS.attr('string'),            
   createdBy: DS.belongsTo('App.Users'),
   products: DS.hasMany('App.Products'), 
   startDate: DS.attr('string'),
   endDate: DS.attr('string')
}

App.Products = DS.Model.extend({
    description: DS.attr('string'),
    img: DS.attr('string'),
    offer: DS.belongsTo('App.Offers'),
}

これら 2 つのモデルを使用して、オファー (親) と製品 (子) の両方を作成します。

var offer = App.Offers.createRecord({/*fields*/}),
    product = App.Products.createRecord({/*fields*/});
offer.get('products').pushObject(product);
offer.get("store").commit();

私がこれを行うときの問題は、FKを設定するために、親が子のIDと子が親のIDを必要とすることです。

ember-data リポジトリで問題と PR を調べたところ、https ://github.com/emberjs/data/pull/440 が見つかりました。基本的に親を作成してから子を作成するwaitForParents関数でcreateRecordをラップすることをお勧めします。彼らの提案を試してみましたが、まだレコードを作成できません。問題は、親のリクエストが最初に行われたとしても、まだ作成されていない子の ID が必要なことです。親リクエストは、次のペイロードで送信されます。

{/*other_fields*/,"products":["/api/v1/products//"]}

URL に商品の ID がないことに注意してください。

4

1 に答える 1

0

この PR の提案に従って修正することができました: https://github.com/emberjs/data/issues/437。彼らは基本的に、waitForParents 関数を作成し、それを createRecord にラップすることを提案しました。この関数は、belongsTo 関係があるかどうかをチェックし、(id フィールドにオブザーバーを追加することによって) 親が作成されるまで、その作成のコード実行を延期します。

私の場合、シリアライザーでも addHasMany をオーバーライドする必要がありました。

同じ問題を抱えている他の人に役立つことを願っています。

于 2013-03-20T12:12:13.190 に答える