【发布时间】:2014-09-24 10:38:23
【问题描述】:
我被这个问题困扰了很长时间,以至于我认为我遗漏了一些明显的东西。这是我的案例的简化模型:
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中的患者ID。但它总是在数组的零位置有null。
StackOverflow 上已经有类似的question。但是解决方案不是很有用。答案是 1.5 岁,这在 Ember 世界中是永恒的。
编辑
Josh RecordArray 在 cmets 中提出,我现在看到的情况不能用于我的情况。或者也许可以,但我不知道如何。我有一个创建新患者的表格。有药物复选框列表。所以我只需要将选中的推送到newPatient.meds。
我现在做什么:我得到选中复选框的 id(等于相应的对象 id),然后为每个 id 获取 Medicine 实例并将其放入数组中。然后我尝试将其推送到`newPatient.meds'中。
【问题讨论】:
-
您好 Nikita,您可能会认为您可能正在以一种不寻常的方式使用
pushObject和save。我不确定meds[i].get('patients').pushObject(p)是否真的会做任何事情。更常见的是看到meds[i].set('patients', <full-array-value>)。 -
我的第二个想法是,我首先将药物列表编译为
RecordArray(例如使用this.store.find('medicine', <some-filter>)。然后我会使用myPatient.set('meds', <RecordArrayFromAbove>)。然后我会打电话给serialize()在我的newPatient对象上保存,然后再保存它以查看 Ember 打算如何对其进行序列化。如果您在那里没有看到结果,请继续使用console.log,直到您可以缩小没有发生某些事情的特定位置期待。 -
@JoshPadnick 谢谢你的建议!我是 Ember 的新手,所以我确信我会以“不寻常”(错误)的方式做很多事情。我会尝试这种方法并报告。
标签: javascript rest ember.js many-to-many ember-data