目次

Ruby/ActiveRecord/動的に接続先を変更する

バージョンと製造年月日

動的に増減する接続先が大量にある場合

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

参考サイト

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

タグ