2012-09-12 61 views
0

我需要查詢與我正在構建的Rails 3.2應用程序(屬於我公司內部使用的不同應用程序)完全分離的第三方數據庫。從Rails 3.2應用程序查詢遠程數據庫

最終,我將設置一個cron來加載我的Rails應用程序將要處理的「其他」數據庫中的新行。

我有權訪問otherdb設置,我想知道從哪裏開始 - 我是否在config/database.yml中創建了新條目?如果是這樣,那麼我該如何指定何時將查詢指向otherdb,而不是我的默認Rails developmentproduction db?

回答

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和使用結果數據,作爲需要。

+0

謝謝 - 我會試試這個。相關說明:我的開發,測試和生產數據庫都是PostgreSQL,所以我正在運行'pg'gem - 我是否還需要*安裝特定於MySQL的gem來處理遠程MySQL數據庫?這些能夠「一起玩耍」,還是應該期待一些衝突? – jasonmklug

+0

你是對的:如果遠程數據庫是不同的產品,那麼它將需要使用不同的適配器。 – Sasha

1

昨天我有同樣的問題。由於您使用的是Rails 3.2,因此連接到外部數據庫的所有模型都必須是建立連接的單個抽象類的子類。在Rails的早期版本中,@ Sasha的答案會起作用。但在3.2中,這個答案會導致你得到各種令人困惑的數據庫錯誤。 (什麼錯誤,你要看你用什麼DB)

在Rails 3.2,這是我發現的唯一辦法,將工作:

  1. 做一個公共基類爲需要所有車型與非默認數據庫 交談。
  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

相關問題