我需要查询第三方数据库,它与我正在构建的Rails 3.2应用程序完全分开(属于我公司内部使用的不同应用程序)。
最终,我将设置一个cron来从我的Rails应用程序将处理的“其他”数据库中加载新行。
我可以访问otherdb
设置,我想知道从哪里开始 - 我是否在config/database.yml
中创建了一个新条目?如果是,那么如何指定何时将查询定向到otherdb
,而不是我的默认Rails development
或production
db?
答案 0 :(得分: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
上使用(作为示例)方法,并根据需要使用结果数据。
答案 1 :(得分:1)
昨天我遇到了同样的问题。由于您使用的是Rails 3.2,因此连接到外部数据库的所有模型都必须是建立连接的单个抽象类的子类。在早期版本的Rails中,@ Sasha的答案会起作用。但在3.2中,该答案将导致您遇到各种令人困惑的数据库错误。 (你得到的错误取决于你使用的数据库。)
在Rails 3.2中,这是我发现的唯一可行的方法:
self.abstract_class = true
来告诉ActiveRecord这个基类是抽象的。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
如果您想了解更多细节,请参阅我写的标题为Establishing a Connection to a Non-Default Database in Rails 3.2的博文。