Railsのdatabase.ymlにはRubyのコードを埋め込める

今回のネタはRailsレシピより。

database.ymlはYAMLとしてパースされる前にERBで前処理されるので、ビューのテンプレートと同じようにRubyスクリプトをファイル内に埋め込むことが可能。
なのでdatabase.ymlの内容を以下のように動的に定義することができる。

< %
socket = ["/tmp/mysqld.sock",
          "/tmp/mysql.sock",
          "/var/run/mysqld/mysqld.sock",
          "/var/lib/mysql/mysql.sock"].detect{|socket| File.exist?(socket)}
%>

development:
  adapter: mysql
  database: hoge_dev
  username: hogetarou
  password: password
  host: localhost
  socket : < %= socket %>

(他の環境は略)

これはほとんどそのままRailsレシピに載ってるレシピ。

MySQLはOSやディストリなどの環境ごとにソケットファイルの位置が違うので、この技を使わない場合はdatabase.ymlを書き換えたりしてやらないといけない。それはけっこうめんどい。
この技をつかっとくと、存在するソケットファイルを動的に選択して使ってくれるのでその煩わしさから解放される。
ちょうど自分の開発環境がVM Ware上のCentOSでプロダクションの動作環境がDebianなので、これはかなり便利。

Railsで実際にガシガシものを作っていると「これってどうやってやるんだろ?」とか「ここがこうなってたら便利なのに」とか思うことがけっこうあるんだけど、Railsレシピにはそういうネタがいろいろとまとまっていて助かる。