在rails中动态创建db表

时间:2012-11-01 10:30:12

标签: ruby-on-rails activerecord

目前,我通过ActiveRecord与数据库中的特定表进行交互。我会事先知道表名,然后我会按rails generate model modelname column1:string ...创建表格。

但是现在,我得到了这个要求,表名是未知的以及将有多少个表。

例如:在目录Projects中,有许多子目录,例如:Projects_AProject_BProject_C ...我需要创建单独的表每个项目。但你不知道会有多少项目。我需要在我的代码中动态创建这些表。如何在我的代码中实现这一点?我是否使用ActiveRecord来实现该方法或任何其他方法?

代码如:

list = maintain_a_dir_list()

Dir.entries( dir ).each { |e|
  if e is not in list
    create_a_table_after_e_name
  end
}

在这里,我将解释为什么我要创建这样的表格:

我上面提到的目录名及其子文件夹名称是不真实的。所以让我们再次讲述这个故事。

我是负载测试员。我为我们公司的一个项目加载测试。假设项目名称为Project_AProject_A有许多版本,如1.0,2.0等。因此,在每个版本中,我都会进行多轮负载测试,以确保产品的质量。

因此,project,verson和loadtest报告之间的关系很简单:项目包含许多版本。每个版本都包含许多在不同日期执行的负载测试报告。

loadtest报告中的信息如下:

交易名称|最短时间|平均响应时间|最长时间

transaction_01 | 1.0s | 2.0s | 3.0s

transaction_02 | 0.5秒| 1.5s | 4.0s

...

要将报告信息存储在数据库中,我创建了一个名为transactions_table的表。表格如下:

report_name | transaction_name | min |平均值|最大

20121001_100users_4hours | transaction_01 | 1.0 | 2.0 | 3.0

20121001_100users_4hours | transaction_02 | 1.0 | 2.0 | 3.0

...

20121002_100users_2hours | transaction_01 | 1.5 | 2.1 | 2.5

20121002_100users_2hours | transaction_02 | 1.1 | 2.1 | 2.7

...

...

然后我想获得涉及的版本信息。所以我创建了另一个名为reports_table的表。表格如下:

版本| REPORT_NAME

project_a_1.0 | 20121001_100users_4hours

project_a_1.0 | 20121002_100users_2hours

...

project_a_2.0 | 20121101_50users_1hours

project_a_2.0 | 20121102_50users_2hours

...

...

当然,我公司的项目不止一个。会有Project_BProject_CD ...因此,版本表再次包含项目名称及其版本。

这是我第一次设计数据库表的关系。所以我不知道我组织表的方式是否正确。

首先,我只是认为我可以在transactions_table中放置所有交易数据 - 无论它属于哪个项目或版本。然后我意识到来自不同项目或版本的报告名称可能是相同的。然后,它无法使用transactions_table分隔select * from transactions_table where report_name = "xxxx"。并且transactions_table的大小将比其他两个表更快地增加。

这就是我考虑将报告存储在不同项目中的原因。

1 个答案:

答案 0 :(得分:0)

最好在项目表中使用folder_name字段吗?