データベースから.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/
インストールしたら、もう一度下記コマンドを実行してみる。
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ファイルに変換される。とっても便利!