【问题标题】:Runtime class creation in Rails. How should I handle this?在 Rails 中创建运行时类。我该如何处理?
【发布时间】:2011-01-11 08:39:32
【问题描述】:

我正在开发一个报告和日志系统,该系统将充当其他应用程序统计信息的视口。我想要 ActiveRecord 的 ORM 功能,但事先没有应用程序的数据库结构。

额外的数据库在 database.yml 中定义,然后我连接到一个类。

class externalapp < ActiveRecord::Base
  establish_connection :externalapp_db
end

def create_class(class_name, superclass, &block)
  klass = Class.new superclass, &block
  Object.const_set class_name, klass
end

我需要能够

  1. 动态创建类(从表中)并
  2. 让它们映射到外部数据库的表

我是不是在错误地处理这个问题? 我怎样才能更好地为外部数据库命名空间,同时允许动态类创建。

建议和帮助表示赞赏。

【问题讨论】:

  • 只为您的用户名投票:P

标签: ruby-on-rails ruby metaprogramming


【解决方案1】:

我过去曾对此进行过实验:

  constant_name = app.database_name.camelize + table_name.camelize

  klass = Class.new(ActiveRecord::Base)   

  ActiveRecord::Base.const_set(constant_name, klass) 

  klass.class_eval do
    set_table_name table_name            
    establish_connection(
      :adapter  => "mysql",
      :host     => app.database_host,
      :username => app.database_username,
      :password => app.database_password,
      :database => app.database_name
    )    
  end      

所以和你的方法非常相似。

【讨论】:

  • 如何命名您的应用程序?
  • 在我的情况下,我确保应用程序数据库名称是唯一的......然后生成的常量与该名称无关。
猜你喜欢
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 2020-12-21
相关资源
最近更新 更多