Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在运行时创建ActiveRecord模型rails3_Ruby_Ruby On Rails 3_Activerecord_Metaprogramming - Fatal编程技术网

Ruby 在运行时创建ActiveRecord模型rails3

Ruby 在运行时创建ActiveRecord模型rails3,ruby,ruby-on-rails-3,activerecord,metaprogramming,Ruby,Ruby On Rails 3,Activerecord,Metaprogramming,我想在运行时创建一个ActiveRecord模型 在我的系统中,我生成了一些报告,所有报告都与数据库表/视图绑定。所以唯一的区别就是表名 所以我想做的是拥有一个活动记录公共类(最好在运行时生成),并在运行时分配表名。我应该能够分配一个范围来选择一个日期范围。我正在考虑在运行时让列名显示数据 有人能帮我解决这个问题吗 在运行时创建ActiveRecord模型 分配作用域方法 我在火车上 提前谢谢 干杯 sameera假设视图名称是静态的,最简单的方法是创建一个具有通用功能的模块,然后将其包含到

我想在运行时创建一个ActiveRecord模型

在我的系统中,我生成了一些报告,所有报告都与数据库表/视图绑定。所以唯一的区别就是表名

所以我想做的是拥有一个活动记录公共类(最好在运行时生成),并在运行时分配表名。我应该能够分配一个范围来选择一个日期范围。我正在考虑在运行时让列名显示数据

  • 有人能帮我解决这个问题吗 在运行时创建ActiveRecord模型
  • 分配作用域方法
我在火车上

提前谢谢

干杯


sameera假设视图名称是静态的,最简单的方法是创建一个具有通用功能的模块,然后将其包含到基本模型中

模模A ... 结束

类扩展了ActiveRecord::Base 包含模块a 结束

类B扩展了ActiveRecord::Base 包含模块a
结束

从你链接的文章中借用
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) }
但除非你对所有桌子都一视同仁,否则我猜你不会这么做的

创建模型类后,现在应该能够打印每个表中的对象及其各自的列:

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) }

那么,您还没有编写任何代码,希望我们为您编写吗?嗨@TinMan,我遇到了以下资源,似乎我应该在ruby中使用“create_class”方法。但我不知道从哪里开始。这就是我把它贴在论坛上的原因。因此,任何资源,文章是欢迎的,谢谢
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) }