@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

既存のRailsプロジェクトからカラム情報を取得する(成功)

config/database.ymlを直接読み込むと"pool"=>"<%= ENV.fetch(\"RAILS_MAX_THREADS\") { 5 } %>"という謎の情報が取得され、正しいデータベースへの接続情報が得られません。

<%=%>はeRubyスクリプトです。 Railsアプリケーションなdatabase.ymlは厳密にはeRubyスクリプトです。

正しいデータベースへの接続情報を得るには、YAMLファイルとして読み込むまえに、eRubyスクリプトとして実行する必要があります。

次のイメージです。

~ irb -r 'erb' -r 'yaml'
irb(main):001:0> YAML.load ERB.new(File.read('config/database.yml')).result
=>
{"default"=>{"adapter"=>"sqlite3", "pool"=>5, "timeout"=>5000},
 "development"=>{"adapter"=>"sqlite3", "pool"=>5, "timeout"=>5000, "database"=>"db/development.sqlite3"},
 "test"=>{"adapter"=>"sqlite3", "pool"=>5, "timeout"=>5000, "database"=>"db/test.sqlite3"},
 "production"=>{"adapter"=>"sqlite3", "pool"=>5, "timeout"=>5000, "database"=>"db/production.sqlite3"}}

次のスクリプトを書きます。

require 'erb'
require 'yaml'
require 'active_record'

ActiveRecord::Base.establish_connection YAML.load(ERB.new(File.read('config/database.yml')).result)['development']
class Computer < ActiveRecord::Base; end
Computer.columns.each do |c|
  printf "%20s %10s \n", c.name, c.type
end

実行してみます。

~ time ruby computer_columns.rb
                  id    integer
           user_name     string
               maker     string
              memory     string
        release_year    integer
          created_at   datetime
          updated_at   datetime

________________________________________________________
Executed in  666.37 millis    fish           external
   usr time  523.43 millis  127.00 micros  523.31 millis
   sys time  131.81 millis  673.00 micros  131.14 millis

実行時間1秒以下で、Railsアプリケーションのカラム情報が取得できました。

参考