我被這個問題困住了很久,我認爲我錯過了一些明顯的東西。這裏是我的案例的簡化模型:如何在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