如何在 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 中播种具有多态一对一关系的模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Node/MongoDB 中播种依赖数据

createList 在 Mirage js 中不拾取关系

在 SQL Server 中实现一对零或一关系

模板中具有多对一关系的Django模型

用于一对零或一关系的实体框架 (EF) 代码优先级联删除

具有多对一关联的实体上的 getArrayResult