2011-01-20 19 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

この回答は見つかりましたか?私はまったく同じことを達成しようとしています。 –

答えて

8

概念的に私はまったく同じ問題を抱えていました。 ActiveRecord :: Baseをサブクラス化し、その接続のスキーマを構築したかったのです。 ActiveRecord :: Base、Schema、およびMigrationへのダイビングにはかなり時間がかかりましたが、うまくいくソリューションが見つかりました。本当に簡単です。

スキーマは、移行のサブクラスであり、提供するブロックでinstance_evalを呼び出します。したがって、我々は、マイグレーションクラスの範囲にあり、それはActiveRecordの::基本サブクラスの接続に@connectionインスタンス変数です変更することができ、すなわち

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

私はこの答えは遅すぎ、おそらく年間で実現します!しかし、それはまだ誰かには役に立つかもしれません。

+1

これは大変助かりました、ありがとう! – netmute

関連する問題