如何使用多个视图为数据库播种一次以获得一致的数据

Posted

技术标签:

【中文标题】如何使用多个视图为数据库播种一次以获得一致的数据【英文标题】: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 种子,但这使得每个项目都一样。

【问题讨论】:

如果这不可能,我也被告知不要担心我的模拟数据有一致的数据,并为“基本作者”和“详细作者”创建两个单独的列表。 【参考方案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') 的路由处理程序可以使用详细作者视图。

以上是关于如何使用多个视图为数据库播种一次以获得一致的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有连接的情况下查询多个相关表,并使用 JDBC 获得一致的数据?

在 IOS 的集合视图中播种从 ELCImagePicker 中选择的多个图像

如何使用 Capistrano gem 为生产数据库播种?

您如何使用具有多个突变的自定义文件正确播种 prisma DB?

多次读取 plist 与创建对象并仅读取 plist 一次以访问 plist 中的数据

Sequelize - 如何使用几何值播种数据库?