我有以下型号:
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'),
}
使用这两个模型,我创建了一个offer(父)和一个product(child):
var offer = App.Offers.createRecord({/*fields*/}),
product = App.Products.createRecord({/*fields*/});
offer.get('products').pushObject(product);
offer.get("store").commit();
当我这样做时,问题是父母需要孩子的id而孩子需要父母的id来设置它的FK。
我在ember-data repo中查找了问题和PR,我发现了这个:https://github.com/emberjs/data/pull/440。它建议在一个waitForParents函数中包装createRecord,该函数基本上创建父项,然后创建子项。虽然我已经尝试了他们的建议但我仍然无法创建我的记录。问题是,即使首先发出对父项的请求,它仍然需要子项的id(尚未创建)。使用以下有效负载发送父请求:
{/*other_fields*/,"products":["/api/v1/products//"]}
请注意网址中产品的缺失ID。
答案 0 :(得分:0)
我设法通过遵循此PR中的建议来修复它:https://github.com/emberjs/data/issues/437。他们基本上建议创建一个waitForParents函数并将其包装在createRecord周围。此函数检查是否存在belongsTo关系并推迟该创建的代码执行,直到创建父代(通过向id字段添加观察者)。
在我的情况下,我不得不在序列化器中覆盖addHasMany。
我希望能帮助其他人解决同样的问题。