2014-09-24 63 views
2

我被这个问题困住了很久,我认为我错过了一些明显的东西。这里是我的案例的简化模型:如何在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。以下是我现在所做的:

  1. 保存新病人之前,我正在将Medicine对象的数组推向newPatient.meds
  2. 然后我保存newPatient
  3. 保存完成后,我正在通过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(); 
        }; 
    }); 
    

但结果是没有什么意思是。

  1. 已保存的患者没有任何药物。在POST请求服务器meds是空数组。
  2. 已保存的药物每个患者身份号码为patients。但数组的零位总是有null

在StackOverflow上也有类似的question。但解决方案不是很有用。并且回答在Ember世界是永恒的1.5岁。

编辑 由Josh RecordArray建议在评论,我现在看到cant't在我的情况下使用。或者也许可以,但我不知道如何。我有一个创建新病人的表格。有药品复选框列表。所以我只需要将已选中的一个推送到newPatient.meds

我现在要做的是:我得到选中的复选框的ID(相当于相应的对象ID),然后为每个ID获取Medicine实例并将其放入数组中。然后我尝试在`newPatient.meds'中推送它。

+0

你好Nikita,你可能会用一种不寻常的方式使用'pushObject'和'save'。我不确定'meds [i] .get('patients')。pushObject(p)'实际上会做什么。看到'meds [i] .set('patients',)'更常见。 – 2014-09-24 23:29:51

+0

我的第二个想法是,我首先将med列表编译为一个'RecordArray'(例如,使用'this.store.find('medicine',)',然后我将使用'myPatient.set ('meds',)'然后在保存它之前,我会在我的'newPatient'对象上调用'serialize()'来查看Ember如何序列化它,如果你没有看到结果, 'console.log',直到你可以缩小特定的地方,而不是像你期望的那样发生什么东西。 – 2014-09-24 23:34:05

+0

@JoshPadnick谢谢你的建议!我是Ember的新手,所以我确信有很多事情我会“非常”(错误),我会尝试这种方法并报告。 – 2014-09-25 09:50:11

回答

1

你应该使用序列化器来解决这个问题。 Here回答你的问题

相关问题