使用Ember数据的一对多或多对多,您如何指定关系

时间:2014-10-06 22:38:29

标签: ember.js ember-data

我是使用ember数据的新手,我不清楚这些关系究竟如何实际链接到正确的记录:

例如,假设我有一个交易和收件人模型。这种关系是收件人的一对多交易。所以我理解我会有类似的东西:

模型/ transaction.js

import DS from 'ember-data';

export default DS.Model.extend({
  recipient: DS.belongsTo('recipient'),
  date: DS.attr('date'),
  amount: DS.attr('string')
}).reopenClass({
  FIXTURES: [
    {
      id: '1',
      date: '2014/10/06',
      recipient: ??
    }
  ]
});

模型/ recipient.js

import DS from 'ember-data';

export default DS.Model.extend({
  name: DS.attr('string'),
  transactions: DS.hasMany('transaction')
}).reopenClass({
  FIXTURES: [
    {
      id: '1',
      name: 'Kurt',
      transactions: ??
    }
  ]
});

所以我的问题是你如何声明哪些交易记录属于哪个特定的收件人记录?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我相信这已经得到了回答,但我找不到在这里引用它的问题,但我也不得不与此作斗争了一段时间。

基本上,如果您使用DS.hasMany()在模型上声明其中一个属性,那么模型将是期望的ID和数组,如果您使用DS.belongsTo(),模型将指望您提供只是相关的ID。

编辑:Ember-data期待您的数据几乎遵循此处描述的内容:http://jsonapi.org/

所以在你的例子中你应该这样:

// models/transaction.js

import DS from 'ember-data';

export default DS.Model.extend({
  recipient: DS.belongsTo('recipient', {async:true}),
  date: DS.attr('date'),
  amount: DS.attr('string')
}).reopenClass({
  FIXTURES: [
    {
      id: '1',
      date: '2014/10/06',
      recipient: 1
    }
  ]
});


//models/recipient.js
import DS from 'ember-data';

export default DS.Model.extend({
  name: DS.attr('string'),
  transactions: DS.hasMany('transaction', {async:true})
}).reopenClass({
  FIXTURES: [
    {
      id: '1',
      name: 'Kurt',
      transactions: [1]
    }
  ]
});

请注意,我在关系声明中添加了{async:true}选项哈希,这将使您的路由能够在将模型呈现给控制器之前异步获取关系内容(请参阅:http://emberjs.com/api/data/#method_hasMany

答案 1 :(得分:0)

这是一个示例jsbin,显示了实施中的ember数据关系映射的工作实现:

http://jsbin.com/jihota/3/edit?html,js,output

我遇到的一个问题是没有理解在模板中我需要通过'语法来引用连接的表格数据。例如,根据收件人ID加入收件人的事务数据行,您将在句柄文件中使用{{recipient.name}}而不仅仅{{name}}来输出已加入的列。