如何在 Mirage js 中播种具有多态一对一关系的模型?
Posted
技术标签:
【中文标题】如何在 Mirage js 中播种具有多态一对一关系的模型?【英文标题】:How to seed models with polymorphic one to one relationship in mirage js? 【发布时间】:2020-06-24 13:49:18 【问题描述】:这只是一个例子,我知道你通常会有多个 cmets,但为了这个例子,我们假设我们有
以下型号:
models:
blogPost: Model.extend(
comment: belongsTo(),
),
picture: Model.extend(
comment: belongsTo(),
),
comment: Model.extend(
commentable: belongsTo( polymorphic: true ),
),
,
及以下工厂:
factories:
blogPost: Factory.extend(
title: "Whatever",
withComment: trait(
comment: association(),
),
),
现在,当尝试使用以下方式播种服务器时:
seeds(server)
server.create("blogPost", "withComment");
它确实播种了,但是在检查console.log(server.db.dump());
时,可评论为空...commentableId: null
。
为什么?
编辑:
这是一个棘手的问题。我变了
comment: Model.extend(
commentable: belongsTo( polymorphic: true ),
),
到:
comment: Model.extend(
blogPost: belongsTo( polymorphic: true ),
),
只是看看commentable
部分是否导致问题。这次我得到了一个不同的错误:
Mirage: You're using the association() helper on your comment factory for blogPost, which is a polymorphic relationship. This is not currently supported."
因此,目前无法在多态关系上使用association()
。我希望这在文档中公布...
不过,即使没有速记 association()
,我也找不到播种的方法。
【问题讨论】:
这很奇怪,我认为可能存在错误。需要调查这个 - 很抱歉你遇到了它! 【参考方案1】:这是一种方法:
import Server, Model, Factory, belongsTo, trait, association, RestSerializer from "miragejs"
export default new Server(
serializers:
blogPost: RestSerializer.extend(
include: ['comment']
),
,
models:
blogPost: Model.extend(
comment: belongsTo(),
),
picture: Model.extend(
comment: belongsTo(),
),
comment: Model.extend(
commentable: belongsTo( polymorphic: true ),
),
,
factories:
blogPost: Factory.extend(
title: "Whatever",
withComment: trait(
afterCreate(blogPost, server)
server.create('comment',
commentable: blogPost
);
),
)
,
seeds(server)
server.create("blog-post", "withComment");
console.log(server.db.dump())
,
routes()
this.resource('blog-post')
)
这是有效的 REPL:http://miragejs.com/repl/v1/144
如果您单击“数据库”选项卡,然后单击“评论”,您应该会看到引用 blog-post:1
的多态 ID。
您也可以向 /blog-posts
发送 GET,您应该会看到包含评论,或者向 /comments
发送 GET 并看到包含多态的 commentable
。
【讨论】:
【参考方案2】:这个特殊的错误:
您在 blogPost 的评论工厂中使用了 association() 助手,这是一种多态关系。目前不支持此功能。”
以这种方式为我解决了: // mirage/factories/comment.js
之前:
import association, Factory from 'ember-cli-mirage';
export default Factory.extend(
blogPost: association()
之后:
import association, Factory, trait from 'ember-cli-mirage';
export default Factory.extend(
blogPost: trait(
receiver: 'blogPost',
blogPost: association()
),
【讨论】:
以上是关于如何在 Mirage js 中播种具有多态一对一关系的模型?的主要内容,如果未能解决你的问题,请参考以下文章