こんにちは、河野です。
Railsでestablish_connectionを使う際には、config/database.ymlに設定済みの内容が利用できるようになっています。
» Railsで複数のデータベースを使用する TECHSCORE BLOG
で鈴木さんが書いてくれていますが、一部引用しますと、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
development: ... other_database: adapter: postgresql encoding: unicode database: other_database pool: 5 username: USERNAME password: PASSWORD host: localhost test: ... production: ... |
1 2 3 4 5 |
class User < ActiveRecord::Base establish_connection :other_database end |
こんな感じですね。
ですが、基本の設定はそのままで、動的に一部の情報を変えたいとか、そういうことがあります。例えば、ユーザ名とパスワードだけ変更するとか。
定義済みの情報をハッシュとして取得する
ActiveRecord::Base.configurationsを使用すると取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
% bundle exec rails c [1] pry(main)> ActiveRecord::Base.configurations => {"development"=> {"host"=>"localhost", "adapter"=>"postgresql", "encoding"=>"unicode", "database"=>"hoge_development", "pool"=>5, "username"=>"USERNAME", "password"=>"PASSWORD"}, "development_other"=> {"host"=>"other_host", "adapter"=>"postgresql", "encoding"=>"unicode", "database"=>"hoge_development_other", "pool"=>5, "username"=>"USERNAME", "password"=>"PASSWORD"}, ... |
ハッシュのキーは文字列になってしまうようです。
必要な部分を書き換えて使う
接続情報がハッシュで取得できれば、必要な部分を書き換えるだけですね。
1 2 3 4 5 6 7 8 9 10 11 |
class User < ActiveRecord::Base def self.new_connection_info connection_info = self.configrations["development_other"] connection_info["username"] = "NEW_USERNAME" connection_info end establish_connection new_connection_info end |
実際には、もっとスマートな感じにできそうですが、とりあえずの流れとしてはこんな感じかなと思います。