menu
書いてる野郎
orebike@gmail.com
ActiveRecord で接続先を使い分ける場合は、ActiveRecord::Base クラスを継承して、connection_establish を個別に呼び出してやる手法がよく載っている。
どんな接続先がくるかもわからない+その接続先が大量にある場合どうすりゃいいのってことでAPIマニュアルを見てたのだが・・・remove_connection
ってメソッドが使えそうだなと思って establish_connection
と交互にやればできるんじゃないかと思ったんだが・・・なんかできない。
なんだか establish_connection は1回しかできないっぽ・・・という結論に達して思案
無名クラスを作るのテクニックを使って、じゃんじゃん作って対処w
require "rubygems" require "active_record" aaa = Class.new(ActiveRecord::Base) aaa.establish_connection(:adapter => 'sqlite3', :dbfile => 'hoge') aaa.set_table_name "piyo" bbb = aaa.find(:first); p bbb.inspect aaa = Class.new(ActiveRecord::Base) aaa.establish_connection(:adapter => 'sqlite3', :dbfile => 'fuga') aaa.set_table_name "piyo" bbb = aaa.find(:first); p bbb.inspect
ここの接続先設定の部分を外からとりながらグルグルループできることがわかると思う。
古い ActiveRecord が原因なのか接続先の DB の種類の問題なのか?テーブル名を指定していてもなぜかクラス名が必要になる動きが確認できた。
クラス名はクラスを定数に格納した段階でその定数名によって初期化される。つまりそこで完全固定。 定数はメソッド無いで宣言することはできないので・・・あ、結構絶望的?ww
require "rubygems" require "active_record" ['hoge', 'fuga'].each do |conn| class Hoge < ActiveRecord::Base end Hoge.establish_connection(:adapter => 'sqlite3', :dbfile => conn) Hoge.set_table_name "piyo" p Hoge.find(:first).inspect end