我有以下型号:
// 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
。余烬检查员确认:
有人知道我在获取数据时如何保持关系吗?
答案 0 :(得分:1)
很高兴您找到了include
!这里的想法是,是否包括关联可以取决于请求。例如,对于JSON:API,许多应用程序将使用query param includes从客户端指定包含。其他应用会将其服务器发送到默认的服务器端包含,这就是include
键的用途。
还请注意,如果您想要更多动态行为,include
可以是一个函数。您可以check out the docs举一些例子。
最后一点– get
处理程序实际上应该返回Mirage数据库中已经存在的内容,而不是创建新资源然后返回它们。这样,您的应用程序的行为将与生产环境中的行为更加相似。
所以不是
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]
})
返回第一个模型(如果端点应返回集合,则返回schema.webs.all()
)。然后,要将初始数据植入Mirage,请使用scenarios/default.js
将数据创建逻辑放入server.create
:
// scenarios/default.js
export default function(server) {
let venue = server.create('venue', {name: 'venue name', id: 100});
server.create('web', {
venue,
webname: 'web name'
});
}
答案 1 :(得分:0)
好吧,我显然做错了。这是正确进行侧面加载的方法。
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;
})
或者可以使用Fixture文件等。