2011-01-20 28 views
6

我正在使用rails 2.3.5和mysql。在ActiveRecord :: Schema上切換連接

我有一個模型TableA和另一個模型TableB。 TableA完全沒問題..但我需要爲TableB交換連接。我正在連接到另一臺服務器,所以我必須檢查該表是否存在。如果沒有,我會創建一個新表。

TableB.establish_connection(new_database_params) 
unless TableB.table_exists? 
    ActiveRecord::Base.establish_connection(new_database_params) 
    ActiveRecord::Schema.define do 
    create_table :table_bs do |t| 
     t.column :text, :string 
    end 
    end 
    ActiveRecord::Base.establish_connection("#{RAILS_ENV}")  
end 

我注意到TableB.establish_connection(new_database_params)將我連接到新服務器。這很好。

當我試圖創建一個新表時,我仍然需要調用ActiveRecord :: Base來交換連接。有沒有辦法在ActiveRecord :: Schema上交換連接? (類似於Model.establish_connection?)

+0

你找到了這個答案嗎?我試圖達到完全一樣的東西。 – 2011-06-13 20:46:07

回答

8

從概念上講,我有完全相同的問題。我想要繼承ActiveRecord :: Base並構建該連接的模式。我花了很長時間才弄清楚,大量潛入ActiveRecord :: Base,Schema和Migration,但是我找到了一個可行的解決方案,而且非常簡單。

Schema是一個Migration的子類,它在你提供的塊上調用instance_eval。因此,我們在遷移類的範圍,可以改變它的@connection實例變量,ActiveRecord的:: Base的子類的連接,即

ActiveRecord::Schema.define do 
    @connection = TableB.connection 
    create_table :table_bs do |t| 
    t.column :text, :string 
    end 
end 

我知道這個答案很可能是一年爲時已晚!但它對某人仍然有用。

+1

這非常有幫助,謝謝! – netmute 2013-12-11 17:46:20