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'
});
}
我有以下型号:
// 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'
});
}