2014-09-24 126 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回答你的問題

相關問題