2013-03-06 96 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