Как засеять модели с полиморфными отношениями один к одному в mirage js?
Это всего лишь пример, я понимаю, что обычно у вас будет несколько комментариев, но для этого примера давайте предположим, что у нас есть
следующие модели:
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
.
Вы также можете отправить GET на /blog-posts
и вы должны увидеть, что комментарий включен, или отправьте GET на /comments
и увидеть полиморфный commentable
включены.
Эта конкретная ошибка:
Вы используете помощник association() в своей фабрике комментариев для blogPost, который является полиморфным отношением. В настоящее время это не поддерживается ".
был разрешен для меня таким образом: // mirage/factory/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()
}),