【问题标题】:How are relationships between related models in ember-data establishedember-data 中相关模型之间的关系是如何建立的
【发布时间】:2013-03-06 15:09:40
【问题描述】:

我假设如果 ember-data 中的模型包含与第二个模型相关的 id,那么该 id 也可用于建立与第二个模型对象的 belongsTo 关系,根据我创建的问题here on github .显然不是这样的。

有谁知道在 ember-data 存储中都存在的两个对象之间建立关系所需的情况?是否必须同时加载相关对象? (或者在 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

【问题讨论】:

    标签: ember.js ember-data


    【解决方案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 项目中的示例/测试以获取更多示例。

    【讨论】:

    • 我仍然不明白的是 API 正在发送 model_b_id 以及 modelA api 调用。但是,所有 modelB 对象之前都是使用 ModelB.find() 调用加载的,因此不需要另一个 API 调用来获取与 modelA 关联的 modelB 数据,也不需要旁加载数据(对于这些数据,我不想侧载它, ModelA.find() 调用在应用程序中经常发生,但 ModelB 有点像一个查找表,其中包含有限数量的不经常更改的值)。那么,ember-data 是否没有找到相关的 modelB 对象 b/c 数据没有被侧载?
    • 如果相关对象已经按照您所说的模型加载,则 ember-data 不会触发 ajax 请求,而是从身份映射中获取。它回答了你的问题吗?
    • 感谢您在 Adrien 上支持我,我真的很感激。我觉得你快要帮我解决我的困惑了。什么是身份图?谷歌搜索让我认为它可能与我所想的商店相同(一种内存浏览器数据库)。如果是这种情况,我认为最后一个modelA.get('modelB') 将返回与model_b_id 2 关联的modelB 对象。既然不是,那么身份映射可能是别的东西。如何通过身份映射使 ID 为 2 的模型 B 与模型 BId 为 2 的模型 A 相关联?
    • 是的,身份映射是将加载的记录保存在浏览器内存中的原因。它应该像你说的那样工作,如果不是,你可能在加载modelA 时遇到问题,或者modelBId 属性可能搞砸了,你能不试试吗?
    • 我在想把 modelBId 作为一个属性放在里面可能之前把它搞砸了,所以我把它删除了。没有任何影响,modelA.get('modelB') 仍然返回 null。会不会是某种缓存设置?我认为我没有围绕任何一个模型(或其属性)进行任何显式缓存设置,但也许存在某种隐式缓存?我会继续将问题标记为已回答 b/c 这里有很多信息,但我仍然看到问题。
    【解决方案2】:

    亚当,

    我自己是从 Ember Data 开始的,混淆通常是由于它对 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}}
    

    默认情况下,Ember Data 将“_id”添加到任何belongsTo 关系的十进制属性名称上,或者将“_ids”添加到任何hasMany。

    【讨论】:

    • 感谢 Colin,感谢您的回复。在这种情况下,我的 API 返回与“model_a”关联的“model_b_id”的密钥(这是在 modelA 实例上设置 modelBId 属性的方式),所以我认为可能还有其他事情发生。不过,非常好的提示,感谢您的参与。我仍然需要处理 jsFiddle 来显示它正在发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2020-01-01
    • 2015-10-09
    • 1970-01-01
    • 2023-03-17
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多