【问题标题】:How to define multiple hasMany relationships of same(parent) type on model?如何在模型上定义多个相同(父)类型的hasMany关系?
【发布时间】:2015-02-26 00:23:33
【问题描述】:

我想在父类型的 Ember Data 模型上定义多个 hasMany 关系,但我不知道如何为此指定逆:

Profile = DS.Model.extend
  # ...
  friends:      DS.hasMany 'profile', async: true
  observed:     DS.hasMany 'profile', async: true
  observers:    DS.hasMany 'profile', async: true

在数据库中处理此类属性对我来说很容易,但是 Ember Data 不支持这一点。是否可以在不创建其他模型的情况下定义这 3 个 hasMany 关系(例如 Friend、Observer)。

我得到的错误:

错误:断言失败:您在 app@model:profile:,但有多个可能的反向关系 类型 app@model:profile: 在 app@model:profile: 上找到。看 在 http://emberjs.com/guides/models/defining-models/#toc_explicit-inverses 关于如何明确指定逆数

【问题讨论】:

    标签: ember.js model coffeescript ember-data ember-cli


    【解决方案1】:

    Ember Data 希望在 belongsTo 端有一个外键,以便它可以为您在任一方向连接模型。 Ember Data 不直接支持多对多关系,因此需要第二个连接模型。

    这与您在 SQL 数据库中建模数据的方式非常一致。

    我最不喜欢 Ember Data 的一件事是它希望在 hasMany 端和 belongsTo 端都有 id。当您具有高基数关系时,这不是一个好方法,因为当基于简单外键的查找更有效时,这意味着大负载和低效查询。它还给人一种错觉,即您也许可以避免使用第二个模型,而您的 Profile 模型可能只有每个关系的 id 数组,但目前它不能以这种方式工作。

    【讨论】:

    • 完全正确,但我没有在 friends 上指定反向(配置文件上没有 belongsTo 'profile'),它按预期工作。我只需要手动添加/删除记录到数组 - 那么为什么它不适用于更多的 hasMany 呢?似乎这里缺乏一致性。我应该立即收到friends: DS.hasMany 'profile', async: true 的错误。
    • 是的,你可以得到混合的结果而没有相反的结果,这种关系只能在一个方向上导航,并且需要人工干预才能使双方的关系保持同步。当您省略反向选项时,Ember 数据将通过类型秘密解析相关模型,这就是为什么它适用于您的关系之一。
    【解决方案2】:

    这暂时有效:

    Profile = DS.Model.extend
      # ...
      friends:      DS.hasMany 'profile', async: true
      observed:     DS.hasMany 'observer', async: true, inverse: 'observer'
      observers:    DS.hasMany 'observer', async: true, inverse: 'observed'
    
    Observer = DS.Model.extend
      observer: DS.belongsTo 'profile', async: true
      observed: DS.belongsTo 'profile', async: true
    

    但是,如果有一种方法可以在不定义另一个模型的情况下做到这一点,我仍然很感兴趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多