我有一个应用程序,每周运行一次报告。
我有一个管理报告运行时间等的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 =但无法使其生效。
如何在动态命名/创建的表中创建新行?
答案 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类并返回它。
但总的来说,我会考虑重新考虑你的设计。根据您使用它的频率,此解决方案可能会变得缓慢而模糊。