【问题标题】:create ActiveRecord model at runtime rails3在运行时创建 ActiveRecord 模型 rails3
【发布时间】:2011-05-12 05:54:34
【问题描述】:

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

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

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

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

我在 rails3

提前致谢

干杯

同人

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    模块模块A ... 结束

    A 类扩展 ActiveRecord::Base 包括模块A 结束

    B 类扩展 ActiveRecord::Base 包括模块A 结束

    【讨论】:

      猜你喜欢
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多