我需要查询一个完全独立于我正在构建的 Rails 3.2 应用程序的第 3 方数据库(属于我公司内部使用的不同应用程序)。
最终,我将设置一个 cron 来从 Rails 应用程序将要处理的“其他”数据库中加载新行。
我有权进行otherdb
设置,但我想知道从哪里开始——我要在 中创建一个新条目config/database.yml
吗?如果是这样,我该如何指定查询何时被定向到otherdb
,而不是我的默认 Railsdevelopment
或production
db?
我需要查询一个完全独立于我正在构建的 Rails 3.2 应用程序的第 3 方数据库(属于我公司内部使用的不同应用程序)。
最终,我将设置一个 cron 来从 Rails 应用程序将要处理的“其他”数据库中加载新行。
我有权进行otherdb
设置,但我想知道从哪里开始——我要在 中创建一个新条目config/database.yml
吗?如果是这样,我该如何指定查询何时被定向到otherdb
,而不是我的默认 Railsdevelopment
或production
db?
有几种方法可以实现此要求,其中最简单的方法是使用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
并使用结果数据。
我昨天有同样的问题。由于您使用的是 Rails 3.2,因此连接到外部数据库的所有模型都必须是建立连接的单个抽象类的子类。在早期版本的 Rails 中,@Sasha 的回答会奏效。但在 3.2 中,该答案会导致您遇到各种令人困惑的数据库错误。(你得到什么错误取决于你使用什么数据库。)
在 Rails 3.2 中,这是我发现的唯一可行的方法:
self.abstract_class = true
。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 中建立与非默认数据库的连接。