2012-12-17 34 views
0

我們的應用程序接收來自各種提要的數據。Ruby/Rails - 動態指定類的連接屬性

以數據庫的形式向我們提供一種飼料。因此,我們有這個數據庫與我們的應用程序數據庫在同一個MySQL服務器實例中。對此Feed數據庫的進一步更新將作爲增量提供,並且必須處理爲完整的Feed數據庫。

所以,我有:

  • app_db
  • feed_db
  • feed_delta_db

feed_dbfeed_delta_db具有相同的結構(表,列等)。

有時我需要訪問feed_db,有時我需要訪問feed_delta_db

之前,我開始接受了三角,我訪問feed_db這樣的:

module Feed 
    module Db 
    module InstanceMethods 
     def something 
     puts 'pffffft' 
     end 
    end 

    def self.included(receiver) 
     receiver.send :include, InstanceMethods 
     receiver.instance_eval { 
     establish_connection(
      { 
      :adapter => "mysql2", 
      :database => "feed_db", 
      :username => "mysql_user", 
      :password => nil, 
      :host => "localhost" 
      } 
     ) 
     } 
    end 
    end 

    class FeedModel < ActiveRecord::Base 
    include Db 
    self.abstract_class = true 
    end 

    class Sometable < FeedModel 
    set_table_name "sometable" 
    belongs_to :someothertable, :foreign_key => "SomeothertableID", :primary_key => "id" 

    def name 
     "#{field1} #{field2}" 
    end 
    end 
end 

現在我可以複製這些代碼爲feed_delta_db,我不得不唯一改變的是在指定的數據庫連接細節。

但這不是乾的,是嗎?

結果將是我想要的。我能夠訪問表中的獨立的數據庫,像這樣: Feed::SometableFeedDelta::Sometable

如何將我的類定義分開自己的文件,包括/需要/不管他們到獨立的模塊(或類)等等我可以隨意訪問任何數據庫?

讓我知道是否有什麼不清楚。

謝謝。

回答

1

我會定義一個通用的父類,然後切換分貝在子類

class GenericParent < ActiveRecord::Base 
    self.abstract_class = true 
end 

class Feed < GenericParent 
    establish_connection :feed_db 
end 

class FeedDelta < GenericParent 
    establish_connection :feed_delta_db 
end 

# config/database.yml 
development: 
    ... 

feed_db: 
    ... 

feed_delta_db: 
    ... 

這將是明智的兌現不同的環境。所以,你可以establish_connection看起來更像:

class Feed < GenericParent 
    establish_connection :"feed_#{Rails.env}" 
end 

,讓您有一個feed_development,feed_staging,feed_production,等你的database.yml部分

+0

這是否幫我曬我的類定義?例如我仍然必須定義'class Sometable'兩次?一旦從'Feed'繼承,並且一旦從'FeedDelta'繼承, – johnnycakes

+0

您是否將它們視爲單獨的模型(不同的功能和/或責任),還是僅僅試圖管理到不同數據庫的兩個連接?後者是 – Brad

+0

。這些類在功能,關聯,方法,數據庫表結構等方面是相同的(並且應該保持這種方式)。他們只需要連接到兩個不同的數據庫(具有不同的數據集)。 – johnnycakes