4

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

我需要连接的数据库在设计时是未知的(即:我不能将它们的详细信息放在 database.yaml 中)。相反,我有一个模型“database_details”,用户将使用它来输入应用程序将在运行时执行查询的数据库的详细信息。

所以到这些数据库的连接真的是动态的,细节只在运行时解决。

4

3 回答 3

10

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

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

如您所见,您可以将 somedatabase 替换为一个database_model.database_name值。适配器和所有设备也是如此。

有关更多信息,请参阅ActiveRecord::Base.establish_connection文档

然后你可以使用:

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

执行您的 SQL 查询。

有关更多信息,请参阅ActiveRecord::Base.find_by_sql文档

如果不完整,马特先生是对的。

可以在此处找到更多过时但对设计方法仍然有用的信息,并记住在完成后重新连接到普通数据库。

于 2008-09-17T08:45:11.140 回答
8

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

  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 并在完成后丢弃该对象。

于 2010-09-17T17:16:56.250 回答
0

您可以通过self.establish_connection.

于 2008-09-17T07:56:03.393 回答