0

我需要查询一个完全独立于我正在构建的 Rails 3.2 应用程序的第 3 方数据库(属于我公司内部使用的不同应用程序)。

最终,我将设置一个 cron 来从 Rails 应用程序将要处理的“其他”数据库中加载新行。

我有权进行otherdb设置,但我想知道从哪里开始——我要在 中创建一个新条目config/database.yml吗?如果是这样,我该如何指定查询何时被定向到otherdb,而不是我的默认 Railsdevelopmentproductiondb?

4

2 回答 2

1

有几种方法可以实现此要求,其中最简单的方法是使用config/database.yml和自定义命名空间模型。

设置类似于下面的内容,使用后缀Rails.env遵循命名约定将提供您概述的功能。

首先,为每个现有环境的外部数据库创建新条目。它将帮助您能够测试功能。

# database.yml
development:
  # add configuration as required

otherdb_development:
  # add configuration as required

其次,为您需要在otherdb数据库中访问的每个特定表添加一个模型。我建议为这些模型添加一个命名空间目录(otherdb在下面的示例中)以避免混淆和潜在的破坏:

# /app/models/otherdb
class Otherdb::Foo < ActiveRecord::Base
  establish_connection "otherdb_#{Rails.env}"
  set_table_name "foo" # customize this if the table name will be different from the classname and is required
end

然后,您可以根据需要使用(作为示例)方法Otherdb::Foo并使用结果数据。

于 2012-09-12T05:56:37.293 回答
1

我昨天有同样的问题。由于您使用的是 Rails 3.2,因此连接到外部数据库的所有模型都必须是建立连接的单个抽象类的子类。在早期版本的 Rails 中,@Sasha 的回答会奏效。但在 3.2 中,该答案会导致您遇到各种令人困惑的数据库错误。(你得到什么错误取决于你使用什么数据库。)

在 Rails 3.2 中,这是我发现的唯一可行的方法:

  1. 为所有需要与非默认数据库通信的模型创建一个通用基类。
  2. 通过调用告诉 ActiveRecord 这个基类是抽象的self.abstract_class = true
  3. 调用establish_connection基类。

以下是来自外部表的学生和课程示例:

# database.yml:
development:
  # default configuration goes here

other_development:
  # external db configuration goes here

class OtherTable < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "other_#{Rails.env}"
end

class Student < OtherTable
end

class Course < OtherTable
end

如果您想了解更多详细信息,请参阅我写的博客文章,标题为在 Rails 3.2 中建立与非默认数据库的连接

于 2012-09-22T04:20:22.807 回答