2013-03-06 189 views
4

我假設如果一個模型中的數據包含一個與第二個模型相關的id,那麼這個id也可以用來建立與第二個模型的belongsTo關係對象,根據我創建的問題here on github。顯然情況並非如此。如何建立相關模型中的相關模型

有沒有人知道需要兩個對象之間的關係,兩個對象都存在於燼數據存儲相互關聯的情況?相關對象是否必須同時加載? (或者在RESTAdapter的情況下通過相同的請求),以便ID引用起作用?如果他們沒有通過相同的請求,那麼是否有必要在稍後的請求中建立該關係,而不必爲查找關係並手動設置它們的請求添加事件處理程序?以下是我看到的問題示例:

App.ModelA = DS.Model.extend({ 
    name:  DS.attr('string'), 
    modelBId: DS.attr('number'), 
    modelB: DS.belongsTo('App.ModelB') 
}); 

App.ModelB = DS.Model.extend({ 
    name: DS.attr('string') 
}); 

App.ModelB.find(2);  // returns an object 

modelA.get('modelBId'); // returns 2 
modelA.get('modelB');  // returns null 

回答

1

例如,從REST API加載/保存數據時,關聯對象的ID很有用。然後你可以使用RESTAdapter併發送相關對象的ID。

例如,對於belongsTo關係,ember-data假定您將發送帶有相關對象ID的密鑰model_b_id。然後,ember-data將處理該對象的加載,通常通過調用API來加載:GET model_b/the_id

也可以通過嵌入它們來加載關聯的對象,而不是通過id給出引用。

有關更多示例,請參閱StackOverflow的其他問題以及ember-data項目中的示例/測試。

+0

我還沒有得到的東西是API發送model_b_id以及modelA api調用。然而,所有的modelB對象以前都是使用'ModelB.find()'調用加載的,因此調用另一個獲得與modelA相關的modelB數據的API並不是必需的,也不需要加載數據(對於這些數據,我不會不想調用它,ModelA.find()調用在應用程序中經常發生,但ModelB有點像查詢表,其數量有限且不經常變化)。那麼,是否ember-data沒有找到相關的modelB對象b/c數據沒有被sideload? – Adam 2013-03-07 18:53:08

+0

如果相關對象已按照您所說的模型加載,則ember-data將不會觸發ajax請求,而是從標識映射中獲取它。它回答你的問題嗎? – 2013-03-07 21:54:30

+0

感謝你在Adrien上對我的支持,我非常感謝。我覺得你接近幫助我解決我的困惑。什麼是身份地圖?谷歌搜索讓我覺得它可能與我作爲商店所想的一樣(在內存瀏覽器數據庫中)。如果是這種情況,我會認爲最後一個'modelA.get('modelB')'會返回與model_b_id 2關聯的modelB對象。既然不是,那麼標識映射可能是別的。我如何使標識爲2的modelB通過標識映射與modelBId爲2的modelA相關聯? – Adam 2013-03-08 04:18:37

1

亞當,

我開始與Ember的數據和自己的困惑,通常是由於REST API的衆多自動化/假設。嘗試:

App.ModelA = DS.Model.extend({ 
    name:  DS.attr('string'), 
    modelB: DS.belongsTo('App.ModelB') 
}); 

凡REST API返回一個A型,如:

{"model_a":{"name": "Adam", "model_b_id": 2}} 

有效默認灰燼數據釘子 '_id',對任何屬於關聯關係,到decamelized屬性名稱,或者「 _ids'to any hasMany。

+0

感謝科林,我很欣賞這種迴應。在這種情況下,我的API正在返回與「model_a」(modelA實例上modelBId屬性的設置方式)關聯的「model_b_id」的鍵,所以我認爲可能還有其他事情正在進行。非常好的提示,謝謝你的加入。我仍然需要處理jsFiddle顯示它正在發生。 – Adam 2013-03-13 21:24:47