ruby - 在运行时创建ActiveRecord模型rails3

标签 ruby ruby-on-rails-3 activerecord metaprogramming

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

在我的系统中,我生成一些报告,所有报告都与数据库表/ View 绑定(bind)。所以唯一的区别是表名。

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

  • 谁能帮我解决一下 在运行时创建 ActiveRecord 模型
  • 分配范围方法

我在rails3上

提前致谢

干杯

同一个

最佳答案

从您链接的文章中借用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) }

关于ruby - 在运行时创建ActiveRecord模型rails3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5973855/

相关文章:

ruby-on-rails - 获取用户正在关注 w/acts_as_follower 的帐户帖子

ruby-on-rails - 关于 Rails 和 Node.js 的说明

javascript - MongoDB:从集合中提取多个随机文档

ruby-on-rails-3 - "Could not connect to server: No such file or directory"使用 beantalk 部署 Rails 应用程序时

sql - 如何编写命名范围以通过传入的所有数组进行过滤,而不仅仅是通过匹配一个元素(使用 IN)

c# - Django 或 Ruby on Rails

ruby - 在 Chef Recipe 中干燥

ruby-on-rails - 使用 Rails 3.1 ActiveRecord 查询查找年度日期

ruby-on-rails - Sass::Engine.render 没有导入蓝图库...为什么?

mysql - 使用 CodeIgniter 中的事件记录类在一个查询中计数、分组、排序?