2013-03-16 71 views
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'), 
} 

使用这两款车型我同时创建一个报价(父)和产品(子):

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回购中的问题和PR,我发现这个:https://github.com/emberjs/data/pull/440。它建议在一个waitForParents函数中包装createRecord,该函数基本上创建了父项,然后是子项。尽管我已经尝试过他们的建议,但我仍然无法创建我的记录。问题是,即使对父进程的请求是先做出来的,仍然需要子进程的标识(尚未创建)。父请求发送时携带以下有效负载:

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

请注意URL中产品的缺失ID。

回答

0

我设法通过遵循此PR中的建议来解决它:https://github.com/emberjs/data/issues/437。他们基本上建议创建一个waitForParents函数并将其包装在createRecord中。该函数检查是否存在belongsTo关系,并推迟该创建的代码执行,直至创建父代(通过向id字段添加观察者)。

在我的情况下,我不得不重写序列化器中的addHasMany。

我希望能帮助其他人解决同样的问题。