ember-cli-mirage 在模型被旁加载时失去关系

ember-cli-mirage loses relationship when models are sideloaded

我有以下型号:

// venue.js
export default Model.extend({
  name: DS.attr('string')
});

// web.js
export default Model.extend({
  webname: DS.attr('string'),
  venue: DS.belongsTo('venue', {async: false})
});

我用的是RESTAdapter。我将 Mirage 配置定义如下:

// serializers/application.js
import { RestSerializer } from 'ember-cli-mirage';

export default RestSerializer.extend({
});

// config.js
export default function() {
  this.get('/webs', schema => {
    let venue = schema.venues.create({name: 'venue name'});
    let web = schema.webs.create({
      webname: 'web name',
      venue: venue
    });


    return {
      web: web,
      venue: venue
    }
  })
}

这个模型侧载是我们应用程序的一部分,所以我必须使用它。无论如何,如您所见,这里的响应很好,即它正确识别了外键等:

但是当我收到回复时,我无法从网络访问场地 - 它是 null。 ember 检查员确认:

有人知道我在获取数据时如何保持关系吗?

好吧,我显然做错了。这是应该如何正确进行侧载。

  • 由于我的 web 需要旁加载 venue,因此我通过调用 ember g mirage-serializer web 创建了一个新的特定于模型的序列化程序。然后我可以通过 include 字段指定应该与主要实体一起加载的关系:
// serializers/web.js
import ApplicationSerializer from './application';

export default ApplicationSerializer.extend({
  include: ['venue'],
});

  • 那么config.js可以改成
// config.js
  this.get('/webs', schema => {
    let venue = schema.venues.create({name: 'venue name', id: 100});
    let web = schema.webs.create({
      webname: 'web name',
      venueId: 100
    });

    return web;
  })

// OR

  this.get('/webs', schema => {
    let venue = schema.venues.create({name: 'venue name', id: 100});
    let web = schema.webs.create({
      webname: 'web name',
      venue: venue
    });

    return web;
  })

或者可以使用夹具文件等

很高兴您找到了 include!那里的想法是,是否包含关联可以取决于请求。例如,对于 JSON:API,许多应用程序将使用 query param includes 来指定来自客户端的包含。其他应用程序将让他们的服务器发送默认的服务器端包含,这就是 include 键的用途。

另请注意,如果您想要更动态的行为,include 可以是一个函数。您可以 check out the docs 举一些例子。

最后一点 – 您的 get 处理程序确实应该 return 使用 Mirage 数据库中已有的内容,而不是创建新资源然后 return 使用它们。这样,您的应用程序的行为将与生产环境中的行为更加相似。

所以不用

this.get('/webs', schema => {
  let venue = schema.venues.create({name: 'venue name', id: 100});
  let web = schema.webs.create({
    webname: 'web name',
    venueId: 100
  });

  return web;
})

尝试

this.get('/webs', schema => {
  return schema.webs.all().models[0]
})

到return第一个模型(或者schema.webs.all()如果端点应该return一个集合)。然后,要使用您的起始数据为 Mirage 播种,请使用 server.create:

将您的数据创建逻辑放入 scenarios/default.js
// scenarios/default.js
export default function(server) {
  let venue = server.create('venue', {name: 'venue name', id: 100});
  server.create('web', {
    venue,
    webname: 'web name'
  });
}