【问题标题】:How to save models with many-to-many relationship in Ember.js?如何在 Ember.js 中保存具有多对多关系的模型?
【发布时间】: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。这是我现在要做的:

  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 中的患者ID。但它总是在数组的零位置有null

StackOverflow 上已经有类似的question。但是解决方案不是很有用。答案是 1.5 岁,这在 Ember 世界中是永恒的。

编辑 Josh RecordArray 在 cmets 中提出,我现在看到的情况不能用于我的情况。或者也许可以,但我不知道如何。我有一个创建新患者的表格。有药物复选框列表。所以我只需要将选中的推送到newPatient.meds

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

【问题讨论】:

  • 您好 Nikita,您可能会认为您可能正在以一种不寻常的方式使用 pushObjectsave。我不确定meds[i].get('patients').pushObject(p) 是否真的会做任何事情。更常见的是看到meds[i].set('patients', &lt;full-array-value&gt;)
  • 我的第二个想法是,我首先将药物列表编译为RecordArray(例如使用this.store.find('medicine', &lt;some-filter&gt;)。然后我会使用myPatient.set('meds', &lt;RecordArrayFromAbove&gt;)。然后我会打电话给serialize() 在我的 newPatient 对象上保存,然后再保存它以查看 Ember 打算如何对其进行序列化。如果您在那里没有看到结果,请继续使用 console.log,直到您可以缩小没有发生某些事情的特定位置期待。
  • @JoshPadnick 谢谢你的建议!我是 Ember 的新手,所以我确信我会以“不寻常”(错误)的方式做很多事情。我会尝试这种方法并报告。

标签: javascript rest ember.js many-to-many ember-data


【解决方案1】:

您应该使用序列化程序来解决这个问题。 Here 是对您问题的回答

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    相关资源
    最近更新 更多