【问题标题】:How to seed database once with multiple views for consistent data如何使用多个视图为数据库播种一次以获得一致的数据
【发布时间】:2018-05-14 18:33:11
【问题描述】:

我可能错误地考虑了模拟 API,但我认为值得一问。

我正在尝试创建一个具有基本视图和详细视图的对象,例如“基本作者”和“详细作者”。但是,我希望每个对象都返回一致的数据。例如,“author_name”之类的属性对于 basic-author 和 detail-author 应该是相同的。

我目前正在尝试通过生成作者列表并扩展它来实现这一点:

// mirage/scenarios/default.js
server.createList('author', 20);

// mirage/config.js
this.get('/basic-author', (schema) => {
  return schema.basicAuthors.all();
});

// mirage/factories/author.js
import { Factory, faker } from 'ember-cli-mirage';
export default Factory.extend({
  // bunch of properties, like author_name
});

// mirage/factories/basic-author.js, mirage/factories/detailed-author.js
import Author from './author';

export default Author.extend({
});

但是,很明显,这是行不通的,因为获取所有 basicAuthors 不会返回任何内容,因为数据库中没有“basic-author”。如果我尝试更改路由以返回所有作者,我的 ember 模型将无法工作,因为它返回了一个包含 20 个作者的列表,这是不正确的模型类型。

我也尝试过设置 faker 种子,但这使得每个项目都一样。

【问题讨论】:

  • 如果这不可能,我也被告知不要担心我的模拟数据有一致的数据,并为“基本作者”和“详细作者”创建两个单独的列表。

标签: ember-cli-mirage


【解决方案1】:

实现这一点的最佳方法是使用工厂特性。 Give the docs 阅读,那么你应该可以设置这样的东西:

// mirage/factories/author.js
import { Factory, trait, faker } from 'ember-cli-mirage';

export default Factory.extend({
  authorName() {
    return faker.name.firstName();
  },
  age: 10,

  withDetails: trait({
    email() {
      return `${this.authorName}@gmail.com`;
    },
    ssn: 123456789
  })

});

然后在测试/开发中你可以创建一个像这样的基本作者

server.create('author');
server.createList('author', 20);

详细作者如下:

server.create('author', 'withDetails');
server.createList('author', 20, 'withDetails');

【讨论】:

  • 谢谢 Sam,我可以动态返回特征吗?这并不真正符合我的用例,因为它不会通过“基本作者”返回同一作者,也不会通过“详细作者”返回具有额外详细信息的同一作者。如果我要从基本作者视图单击到详细作者视图,则作者名称会有所不同。
  • 在这种情况下,我希望 XHR 请求有一个与之关联的id,在这种情况下,您可以使用schema.users.find(4)(例如)来检索相关作者。不同的路由处理程序也可以使用不同的序列化程序,因此get('/authors/:id') 的路由处理程序可以使用详细作者视图。
猜你喜欢
  • 2011-07-31
  • 2017-11-25
  • 2013-06-21
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2017-05-12
相关资源
最近更新 更多