我想在运行时创建一个ActiveRecord模型。
在我的系统中,我正在生成一些报告,所有这些报告都与数据库表/视图绑定。因此,唯一的区别是表名。
所以我想做的是有一个活动记录公共类(最好在运行时生成)并在运行时分配表名。 我应该能够分配一个范围来选择日期范围。我正在考虑在运行时获取列名以显示数据。
- 谁能帮我解决如何在运行时创建活动记录模型
- 分配范围方法
我在轨道上
3提前致谢
干杯
萨梅拉
借用您链接的文章create_class
,像这样的事情怎么样:
TABLE_NAMES = %w[customers products purchases]
def create_class(class_name, superclass, &block)
klass = Class.new superclass, &block
Object.const_set class_name, klass
end
def create_model_class(table_name)
create_class(table_name.classify, ActiveRecord::Base) do
scope :in_date_range, lambda {|start_date, end_date| where("start_date >= ?", start_date).where("end_date <= ?", end_date) }
end
end
TABLE_NAMES.each {|table_name| create_model_class(table_name) }
如果要使用数据库中的所有表,可以执行以下操作:
TABLE_NAMES = ActiveRecord::Base.connection.tables
但除非你以相同的方式对待所有表,否则我猜你不会想这样做。
创建模型类后,现在应该能够打印每个表中的对象及其各自的列:
def print_attributes(model_obj)
puts model_obj.attributes.map {|k,v| "#{k}=#{v.inspect}" }.join(', ')
end
Customer.in_date_range(Date.today, Date.today + 1.day).each {|c| print_attributes(c) }
Product.in_date_range(Date.yesterday, Date.today + 2.days).each {|c| print_attributes(c)
Purchase.in_date_range(Date.yesterday, Date.today + 3.days).each {|c| print_attributes(c) }
假设视图名称是静态的,最简单的方法是创建一个具有通用功能的模块,然后将其包含在基本模型中。
模块 模块A...结束
类 A 扩展活动记录::基本 包括模块 A结束
B 类扩展活动记录::基本 包括模块 A结束