データベースから.ymlファイルに変換する。

この前、db:fixtures:loadで.ymlファイルに記述した内容をデータベースに設定する方法を覚えた。それなら逆に、データーベースの内容を.ymlファイルに変換する方法はないかと探していたら、やっぱりそんな方法があるんですね。これで、マイグレーションと組み合わせて、データベースの移行が手軽にできるようになる。とっても便利だ!

ar_fixturesプラグイン

~/railsapp/softwarebookへディレクトリを移動して、以下のコマンドでインストールする。

script/plugin install http://topfunky.net/svn/plugins/ar_fixtures

インストールして下記のコマンドを実行すると...

script/runner "Keyword.to_fixture"

test/fixtures/keyword.ymlファイルに、データベースのkeywordsテーブルの内容が書き出される。

しかし、ファイルを確認してみると日本語が文字化けしている...。

--- 
keyword_00001: 
  name: Ruby on Rails
  id: 1
keyword_00002: 
  name: "web?xE3?x83?x96?xE3?x83?xA9?xE3?x82?xA6?xE3?x82?xB6"
  id: 2
keyword_00003: 
  name: !binary |
    55S75YOP566h55CG

  id: 3

yaml_wamlプラグイン

この文字化けを解消してくれるプラグインyaml_wamlプラグインを見つけた。早速、ダウンロードしてみた。~/railsapp/softwarebookへディレクトリを移動して、以下のコマンドでインストールする。

script/plugin install http://yaml-waml.googlecode.com/svn/trunk/yaml_waml/tags/rel/0.1.0/
      • インストールすると、プラグイン名が「0.1.0」となっている。おそらくバージョン番号なのだろう。ちょっと、わかり難いのでRadRailsで名前を「yaml_waml」に変更した。

インストールしたら、もう一度下記コマンドを実行してみる。

script/runner "Keyword.to_fixture"

test/fixtures/keyword.ymlファイルを確認すると、今度はちゃんと日本語で表示される。

--- 
keyword_00001: 
  name: Ruby on Rails
  id: 1
keyword_00002: 
  name: "webブラウザ"
  id: 2
keyword_00003: 
  name: "画像管理"
  id: 3

db:fixture:save

やっぱり、db:fixture:loadのように、コマンド一つでまとめて処理したい。そんな時は、lib/tasks/save_fixtures.rakeファイルを作成する。参考ページより以下のコードをコピーさせて頂いた。(感謝です)

desc "Save fixtures from the current environment's database"
task :"db:fixtures:save" => :environment do
  pre_defined = Object.subclasses_of(ActiveRecord::Base)
  Dir["app/models/*.rb"].each{|i| eval File.basename(i, '.rb').classify}
  (Object.subclasses_of(ActiveRecord::Base) - pre_defined).each{|klass| klass.to_fixture}
end
task :save_fixtures => "db:fixtures:save" # alias

これで、RadRailsの「Rake タスク」タブで、db:fixtures:saveを実行すると、app/models/以下のテーブルの内容がすべて.ymlファイルに変換される。とっても便利!