如何构建我的Ember模型和API数据来表示关系数据?

时间:2017-02-10 09:46:03

标签: ember.js json-api

我是jsonapi的新手,以及结构是如何工作的,并试图让关系正确加载。我期待ember-data遵循提供url的关系。我的对象的链接可以获取所需的信息,但是我得到了意想不到的结果。

我有像这样定义的用户,区域和用户/区域关系:

// User Model
const UserModel = DS.Model.extend({
    username: DS.attr('string'),
    territories: DS.hasMany('user-territories')
}

// Territory Model
const TerritoryModel = DS.Model.extend({
    name: DS.attr('string')
}

// User-Territory Model
const UserTerritoryModel = DS.Model.extend({
    notes: DS.attr('string'),
    startDate: DS.attr('date'),
    user: DS.belongsTo('user'),
    territory: DS.belongsTo('territory')
}

然后我有模拟数据(使用http-mock),如下所示:

// api/users/
data: {
    type: "users",
    id: 1,
    attributes: {
        username: "thisIsMyUsername"
    }
},
relationships: {
    territories: {
        links: {
            self: "http://localhost:4200/api/users/1/territories"
        }
    }
}

// api/users/1/territories
data: {
    type: "user-territories",
    id: 1,
    attributes: {
        notes: "This is a note",
        startDate: "2017-01-01"
    }
},
relationships: {
    user: {
        link: {
            self: "http://localhost:4200/api/users/1"
        }
    },
    territory: {
        link: {
            self: "http://localhost:4200/api/territories/1"
        }
    }
}

// api/territories/1
data: {
    type: "territories",
    id: 1,
    attributes: {
        name: "Territory #1"
    }
}

在我的用户路由中,我想请求UserModel并且可以访问UserTerritory关系数据和Territory本身。 api调用不是我所期望的:

this.get('store').findRecord('user', 1, { include: "territories" });

预期:

  • API /用户/ 1
  • API /用户/ 1 /地区

ACTUAL:

  • API /用户/ 1
  • api / users / 1?include = territories

如果我调用用户区域模型,我会得到:

预期:

  • API /用户/ 1 /地区

ACTUAL:

  • API /用户地区/ 1

1 个答案:

答案 0 :(得分:1)

如果你使用included,ember-data基本上认为你想告诉服务器侧载数据。如果您返回links,只需解决该关系。但是relationships必须位于data内。 self链接也用于关系本身,以返回数据使用related

首先,您执行user = store.findRecord('user', '1')之类的操作,这将获取api/users/。然后你应该返回这样的东西:

// api/users/
{
  data: {
    type: "users",
    id: 1,
    attributes: {
      username: "thisIsMyUsername"
    }
    relationships: {
      territories: {
        links: {
          related: "http://localhost:4200/api/users/1/territories"
        }
      }
    }
  }
}

接下来你做user.get('territories')。这将返回一个promise,并获取http://localhost:4200/api/users/1/territories或该相关链接中的任何内容。不过知道,ember-data期望您在此处返回user-territories,因为这是您使用territories: DS.hasMany('user-territories')指定的内容。您应该知道在没有第三个表的情况下,您可以直接在ember-data中为多对多关系建模。