2012-09-02 40 views
4

我們在Heroku上託管了一個Rails應用程序,我需要爲我們的營銷人員設置一些分析頁面。這似乎是Heroku的典型用例follow databaseHeroku遵循:如何在Rails應用程序中處理多個數據庫?

2個數據庫將共享相同的模型類,我只想要一些操作來查詢複製的數據庫。

在我的應用程序中處理這種情況的首選方法是什麼?

ActiveRecord::Base documentation有關類特定連接會談:

您還可以設置一個特定的類連接。例如,如果課程 是一個ActiveRecord :: Base,但駐留在不同的數據庫,你可以 只是說Course.establish_connection和課程及其所有子類 將使用此連接來代替。

我應該繼承我的所有模型類來指定連接到輔助數據庫嗎? (將它甚至工作?)

我也發現了這種寶石,但似乎不再保持.... magic_multi_connections gem

+0

見http://stackoverflow.com/questions/6122508/connecting-rails-3-1-with-multiple-databases – apneadiving

+0

從我的理解這解釋瞭如何訪問不同不同的模型存儲在不同的數據庫中。這是不一樣的情況:我會有一個從主數據庫只讀副本的輔助數據庫。如果我遵循這個方法,我需要繼承我所有的模型類... – vdaubry

回答

10

所以...我是這樣解決的:

module Analytics 

    class Base < ActiveRecord::Base 
    self.abstract_class = true 
    establish_connection ENV['ANALYTICS_DATABASE_URL'] 
    end 

    class User < Base; end 

    class Product < Base; end 

end 

現在你有所有連接到您的分析數據庫(跟隨者)模型。

如果您需要在您的分析應用程序,您的正常應用程序之間共享範圍或方法,你可以把共享代碼在一個mixin,然後只包括在任何Analytics(分析)或正常模式。

另外,您也可以在需要用於控制器分析的模型上調用.establish_connection,然後再將其用於分析,但我不知道這是否會讓您的連接變爲其他正常的Web請求,要求您設置爲開啓下一個請求你正常的數據庫連接...

UPDATE:另一個想法只是讓我吃驚:

class UserBase < ActiveRecord::Base 
    self.abstract_class = true 
    # all your user model code goes here 
end 

class User < UserBase 
    establish_connection(Rails.env) # connect to your normal database 
end 

class AnalyticsUser < UserBase 
    self.table_name = 'users' 
    establish_connection(ENV['ANALYTICS_DATABASE_URL']) 
end 

這可以讓你分享你的模型之間的所有代碼是否適用於分析或正常的Web請求sts,但根據型號名稱設置不同的連接。

此外,作爲一個旁註,如果你不希望建立一個跟隨在你的開發環境,只需設置ENV [「ANALYTICS_DATABASE_URL」]在您的development.rb:

ENV['ANALYTICS_DATABASE_URL'] ||= 'postgres://localhost/myapp_development' 

而且很明顯,在Heroku上,你需要重命名或設置配置VAR爲您ANALYTICS_DATABASE_URL到任何你跟隨的DATABASE_URL是。

+1

如果你這樣做(在UPDATE中),你將創建多個連接池,因爲Rails每次創建連接池時調用'建立連接'方法。這是一個更好的方法,因爲它是第一次,在UserBase中進行連接。 – Ron

相關問題