从Rails 3.2应用程序查询远程数据库

时间:2012-09-12 00:28:02

标签: ruby-on-rails database ruby-on-rails-3

我需要查询第三方数据库,它与我正在构建的Rails 3.2应用程序完全分开(属于我公司内部使用的不同应用程序)。

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

我可以访问otherdb设置,我想知道从哪里开始 - 我是否在config/database.yml中创建了一个新条目?如果是,那么如何指定何时将查询定向到otherdb,而不是我的默认Rails developmentproduction db?

2 个答案:

答案 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中,这是我发现的唯一可行的方法:

  1. 为需要与之交谈的所有模型建立一个公共基类 非默认数据库。
  2. 通过调用self.abstract_class = true来告诉ActiveRecord这个基类是抽象的。
  3. 在基类中调用establish_connection
  4. 以下是来自外部表格的学生和课程的示例:

    # 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的博文。