Как засеять модели с полиморфными отношениями один к одному в 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()
  }),
Другие вопросы по тегам