情况如下。

我正在编写一个 Rails 应用程序,它将监视某些特定数据库的数据质量。为了做到这一点,我需要能够对这些数据库执行直接 SQL 查询——这当然与用于驱动 Rails 应用程序模型的数据库不同。简而言之,这意味着我无法使用通过 ActiveRecord 基本连接的技巧。

我需要连接的数据库在设计时未知(即:我无法将他们的详细信息放入database.yaml)。相反,我有一个模型“database_details”,用户将使用它来输入应用程序在运行时执行查询的数据库的详细信息。
因此,与这些数据库的连接实际上是动态的,并且细节仅在运行时解决。

我怎样才能做到这一点?

谢谢,
罗洛

有帮助吗?

解决方案

我遇到过这样的情况,我必须连接到外部应用程序的数百个不同实例,并且我执行了类似于以下内容的代码:

  def get_custom_connection(identifier, host, port, dbname, dbuser, password)
      eval("Custom_#{identifier} = Class::new(ActiveRecord::Base)")
      eval("Custom_#{identifier}.establish_connection(:adapter=>'mysql', :host=>'#{host}', :port=>#{port}, :database=>'#{dbname}', " +
      ":username=>'#{dbuser}', :password=>'#{password}')")  
    return eval("Custom_#{identifier}.connection")
  end

这样做的另一个好处是不更改模型继承的 ActiveRecord::Base 连接,因此您可以针对此连接运行 SQL,并在使用完毕后丢弃该对象。

其他提示

您可以使用这样的调用以编程方式建立连接

ActiveRecord::Base.establish_connection(
   :adapter  => "mysql",
   :host     => "localhost",
   :username => "myuser",
   :password => "mypass",
   :database => "somedatabase"
)

如您所见,您可以用database_model.database_name值替换somedatabase。与适配器和所有相同

ActiveRecord::Base.built_connection 文档

然后你可以使用

ActiveRecord::Base.find_by_sql("select * ") 

执行你的sql查询。

ActiveRecord::Base.find_by_sql 文档

马特先生 如果不完整的话是正确的

更多信息(已过时但对设计方法仍然有用)可以找到 这里 并记住完成后重新连接到普通数据库:)

您也许可以通过以下方式做到这一点 自我建立连接

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top