当模型被侧载时,ember-cli-mirage 失去关系
Posted
技术标签:
【中文标题】当模型被侧载时,ember-cli-mirage 失去关系【英文标题】:ember-cli-mirage loses relationship when models are sideloaded 【发布时间】:2019-11-12 06:14:14 【问题描述】:我有以下型号:
// 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
。余烬检查员确认:
有没有人知道我在获取数据时如何保持这种关系?
【问题讨论】:
【参考方案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 播种,使用 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'
);
【讨论】:
【参考方案2】:好吧,显然我做错了。以下是正确执行侧载的方法。
由于我的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;
)
或者可以使用夹具文件等。
【讨论】:
以上是关于当模型被侧载时,ember-cli-mirage 失去关系的主要内容,如果未能解决你的问题,请参考以下文章
Ember 数据模型中的计算属性不适用于 ember-cli-mirage 模型