Rails 如何解决 fixtures 数据量很大的时候,数据内容的关联性问题

ery · 2012年02月29日 · 最后由 fsword 回复于 2012年03月04日 · 3458 次阅读

Rails fixtures 量大,维护的问题

把 fixtures 导入发布环境的数据库中, 作为给客户看的演示数据。 fixtures 数量少的时候维护起来没有什么问题, 当需要 fixture 有一定的规模, 这时数据库中有一些 自动生成数据 ,这些数据就不易人工手动维护。

具体例子:

有三个 Model

class Contact after_save :create_2_search_keys end

class Product after_save :create_3_search_keys end

class Searchkey end

每生成一条 contact 会产生 2 条 searchkey 记录, 每生成一条 product 会产生 3 条 searchkey 记录, 比如, 50 条 contact 记录, 100 条 product 记录, 那么应该有 400 条 searchkey 记录, 并且这 400 条 searchkey 记录的内容和 contact 和 product 记录的内容保持一致

如果手动添加 50 条 contact 记录和 100 条 product 记录,并不是很困难, 但是要手动添加 400 条 searchkey 记录, 还要保证 searchkey 记录的内容和 contact 与 product 保持一致, 就会变得非常困难。

目前有如下解决方案:

  • 我们考虑过 seed 和 factory,但是并不能满足我们的情况,因为我们想在基于 fixture,而不是跨越 fixture。
  • 我们还在寻找其他相关 gem
  • 目前我们的解决方案是,通过脚本,动态创建 fixtures 的 yml 文件。

请问各位有什么好的解决办法,或是相关的 gem 请推荐。

不是有个东西叫 seed 么。?

factory girl

还有些产生 user name 和 email 的 gem 我忘了名字了

factory_gril +1

我想最好的办法就是不要用,改用其它 factory

忘记说了。seed 和 factory 我们都考虑过,但是,就我们的情况而言都不是最好的解决方案。

#2 楼 @Rei faker 和 ffaker

这个帖子我始终不知道怎么回答,主要是没弄清楚楼主问题的要点,如果只是要满足大量的关联数据的话,那么使用 sql 最简单,预先准备好数据,然后导出成 sql,需要时 import 进去,不需要时 truncate,数据完整性之前就保证好,测试速度也能保证

#7 楼 @fsword 这个方法也不错,主要优点是,可以让不懂技术的人,通过操作程序制作 demo 数据。谢谢你的提议,但是我不喜欢把 sql 的数据导来导去的。

#8 楼 @ery 既然说了就展开一下,我最近正好在分析团队里不同应用进行的基于数据的测试,目前比较了几个方案以后的基本感受是——“没有包打天下”的方案,数据量大的时候只有 sql 能满足性能要求,这对于计算密集型的、分析型的应用很适合,但是基于 sql 的数据准备对于数据关联复杂的业务很不合适,主要是缺少数据 build 的时候不能基于业务模型......

所以我现在对团队的建议是——“混合策略”,同时使用三种方式:

  • 基于 sql 直接灌数据
  • 基于 factory_girl 建立独立的测试数据
  • 基于现有的 model 直接编写 ruby 代码生成相关数据

另外,如果有兴趣,建议你了解一下 scenariotest,杭州 ruby tuesday 的活动有一次就是讲这个的,它每次构造数据后会缓存用过的 sql,所以重复使用性能应该比 factory_girl 好,当然,对于巨量的数据,它依然还是比较慢的,算是个折衷

需要 登录 后方可回复, 如果你还没有账号请 注册新账号