Ruby on RailsでMagic Multi-Connectionsを使う

今回は、メインをMySQLでサブをOracleで二つのデータベースを用いる実験をしてみます。

まず、ライブラリをインストールします

gem install magic_multi_connections

database.ymlにOracle用の接続情報を追加します。

oracleDb:
  adapter: oracle
  database: ora1.hoge
  username: hoge
  password: hoge

次にenvironment.rbの最後に以下の行を付け足します。

require 'magic_multi_connections'

module OracleDB
  establish_connection :oracleDb
end

後は、Oracle側のテーブルのModelを作るります。

#sample.rb
class Sample < ActiveRecord::Base
end

ここで注意です。
MySQLの方にOracleで使用するテーブルをあらかじめダミーで作っていないと以下のようなエラーになります。

ActiveRecord::StatementInvalid: Mysql::Error: #42S02Table 'hoge.samples' doesn
't exist: SHOW FIELDS FROM samples
        from c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_recor
d/connection_adapters/abstract_adapter.rb:128:in `log'
        from c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_recor
d/connection_adapters/mysql_adapter.rb:243:in `execute'
        from c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_recor
d/connection_adapters/mysql_adapter.rb:348:in `columns'
        from c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_recor
d/base.rb:763:in `columns'
        from c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_recor
d/base.rb:2060:in `attributes_from_column_definition_without_lock'
        from c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_recor
d/locking/optimistic.rb:45:in `attributes_from_column_definition'
        from c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_recor
d/base.rb:1502:in `initialize_without_callbacks'
        from c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_recor
d/callbacks.rb:225:in `initialize'
        from (irb):1
>> OracleDB::Sample.find(1)

最初、何でOracle側に参照しようとしているのにMySQL側を見てるんだ!!
と思いましたが、両方に作ったら、正しくOracle側を見てくれるようになったので
わかりました。
最後にテストです。

C:\sample\hoge\rails>ruby script/console
Loading development environment.
>> OracleDB::Sample.find(1)
=> #"\202\253\202\275\202\346",
 "id"=>1.0}>

結果が文字化けしてるのはご愛嬌。
取得したときtoutf8をかけるのでOK