【问题标题】:Ember Data: resolve ambiguous inverses when using multiple belongsTo relationships between two modelsEmber Data:在两个模型之间使用多个 belongsTo 关系时解决模棱两可的逆
【发布时间】:2015-02-19 01:22:54
【问题描述】:

假设我有两个 Ember Data 模型:competitionparticipant

我的竞赛模型存储以下数据:datefirstsecondthirdfirstsecondthird 属性将存储第一、第二和第三名的唯一竞争对手的 ID。

我的participant 模型存储以下数据:namesurnamecompetition

参与者只参加一场比赛,因此participant 模型不需要competition 上的hasMany 关系。

如何在 Ember Data 中对此进行建模?

以下是我认为可行的方法:

// app/models/competition.js

export default DS.Model.extend({
  rev: DS.attr('string'),
  date: DS.attr('date', {defaultValue: function() { return new Date(); }}),
  first: DS.belongsTo('participant'),
  second: DS.belongsTo('participant'),
  third: DS.belongsTo('participant')
});

// app/models/participant.js

export default DS.Model.extend({
  rev: DS.attr('string'),
  name: DS.attr('string'),
  surname: DS.attr('string'),
  competition: DS.belongsTo('competition')
});

问题是participant.js 上的competition 键需要显式逆向,并且无法知道它可能与competition 上的三个键中的哪一个有关。

我应该如何指定我的倒数? competitionparticipant 模型都需要显式逆吗?如果是这样,它们应该是什么?这种数据结构在 Ember Data 中是否可行?我应该完全使用不同的方法吗?

请权衡一下。我已经在脑海中扭转了这个问题几个小时,但我的解决方法都没有成功。

【问题讨论】:

  • 你的响应 json 是什么样的?
  • 没有 JSON 可言。我正在使用 PouchDB,所以我不需要序列化任何东西。当我查看 localstorage 数据库时,所有的 belongsTo 字段都是空的。

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


【解决方案1】:

我自己没有使用过 ember-data 多态关联,但我相信多态 belongsTo 关联可能适合您的需求。我的回答改编自这个blog post 。另请查看这两个教程:http://www.toptal.com/emberjs/a-thorough-guide-to-ember-datahttp://blog.unspace.ca/post/107228551852/luke-galea-on-ember-data-polymorphic-associations

 //app/models/competition.js
 export default DS.Model.extend({
   rev: DS.attr('string'),
   date: DS.attr('date', {defaultValue: function() { return new Date(); }}),
   participant: DS.belongsTo("particpant", {polymorphic: true,   async: true})
  });

 // app/models/participant.js
 export default DS.Model.extend({
   rev: DS.attr('string'),
   name: DS.attr('string'),
   surname: DS.attr('string'),
   competition: DS.belongsTo('competition')
 });

 // app/models/first.js
 import Participant from '../participant';
 export default Participant.extend({
 });

 // app/models/second.js
 import Participant from '../participant';
 export default Participant.extend({
 });

【讨论】:

  • 我会在周末测试这个解决方案,让你知道它是否对我有用。感谢您提供此建议。我目前的解决方案是简单地将竞争对手模型展平并将所有三个竞争对手的所有密钥迁移到竞争模型。这是一个丑陋的黑客,我希望有更好的方法。
猜你喜欢
  • 2021-09-28
  • 2016-04-02
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
相关资源
最近更新 更多