动态报告数据表

时间:2014-07-05 09:04:38

标签: ruby-on-rails rails-activerecord

我有一个应用程序,每周运行一次报告。

我有一个管理报告运行时间等的Report模型,并存储生成的表名

我想要做的是每次生成报告时都创建一个新表。

我有一个控制器创建自定义表

我使用table ='report _'+ Digest :: MD5.hexdigest(d)创建了一个随机名称 然后报告= Reporter.new_reporter(表)创建表

def self.new_reporter(table)
   ActiveRecord::Base.connection.create_table(table) do |t|
     t.integer :period, :limit => 4
     t.date :period_start_date
end

这成功创建了表,但问题是我无法将数据导入到这个动态创建的表中。

我创建了一个名为report_table的模型,并尝试使用ReportTable.table_name =但无法使其生效。

如何在动态命名/创建的表中创建新行?

1 个答案:

答案 0 :(得分:1)

由于Ruby中的类只是Class类型的对象,因此您可以在运行时动态创建它们。所以,我想这样的事情应该有效:

# generate the the table name
report_table_name = 'report_'+Digest::MD5.hexdigest(d)

# create the table
Reporter.new_reporter(report_table_name)

# dynamically create a Class object with AR as parent class
# and set the right table name
report_model = Class.new(ActiveRecord::Base)
report_model.table_name = report_table_name

# from here on you should be able to invoke any AR method on the dynamic class
report_model.create(period: 1, period_start_date: Time.now.to_date)

为了使它更符合逻辑,您可以在new_reporter方法中实现它,以便它接受表名,创建表及其根据AR类并返回它。

但总的来说,我会考虑重新考虑你的设计。根据您使用它的频率,此解决方案可能会变得缓慢而模糊。