我被这个问题困住了很久,我认为我错过了一些明显的东西。这里是我的案例的简化模型:如何在Ember.js中保存具有多对多关系的模型?
有Patient
,他有她/她需要的所有药物。有Medicine
,所有患者都服用它。
// Patient model
Yo.Patient = DS.Model.extend({
firstName: DS.attr('string'),
lastName: DS.attr('string'),
meds: DS.hasMany('medicine')
});
// Medicine model
Yo.Medicine = DS.Model.extend({
title: DS.attr('string'),
patients: DS.hasMany('patient')
});
我已阅读官方手册和许多资源。最后一个,最接近我的情况是这个Toptal tutorial。以下是我现在所做的:
- 保存新病人之前,我正在将
Medicine
对象的数组推向newPatient.meds
。 - 然后我保存
newPatient
。 保存完成后,我正在通过
Medicine
对象将newPatient
推送给每个对象并保存每个对象。newPatient.get('meds').pushObjects(meds); newPatient.save().then(function (p) { for (var i = 0; i < meds.length; i++) { meds[i].get('patients').pushObject(p); meds[i].save(); }; });
但结果是没有什么意思是。
- 已保存的患者没有任何药物。在
POST
请求服务器meds
是空数组。 - 已保存的药物每个患者身份号码为
patients
。但数组的零位总是有null
。
在StackOverflow上也有类似的question。但解决方案不是很有用。并且回答在Ember世界是永恒的1.5岁。
编辑 由Josh RecordArray
建议在评论,我现在看到cant't在我的情况下使用。或者也许可以,但我不知道如何。我有一个创建新病人的表格。有药品复选框列表。所以我只需要将已选中的一个推送到newPatient.meds
。
我现在要做的是:我得到选中的复选框的ID(相当于相应的对象ID),然后为每个ID获取Medicine
实例并将其放入数组中。然后我尝试在`newPatient.meds'中推送它。
你好Nikita,你可能会用一种不寻常的方式使用'pushObject'和'save'。我不确定'meds [i] .get('patients')。pushObject(p)'实际上会做什么。看到'meds [i] .set('patients',)'更常见。 –
2014-09-24 23:29:51
我的第二个想法是,我首先将med列表编译为一个'RecordArray'(例如,使用'this.store.find('medicine',)',然后我将使用'myPatient.set ('meds',)'然后在保存它之前,我会在我的'newPatient'对象上调用'serialize()'来查看Ember如何序列化它,如果你没有看到结果, 'console.log',直到你可以缩小特定的地方,而不是像你期望的那样发生什么东西。 –
2014-09-24 23:34:05
@JoshPadnick谢谢你的建议!我是Ember的新手,所以我确信有很多事情我会“非常”(错误),我会尝试这种方法并报告。 – 2014-09-25 09:50:11