fixtureを手で作るのはとても疲れるので、DBから自動生成したり、FactoryGirlをはじめとしたFixture alternativeを使うことが多いと思います。
DBからfixtureのYAMLを生成する方法は色々見つかりますが、今回は要件を満たすものが見つからなかったので、rakeタスクを作ってみました。
複数行テキストやコロン(:)が含まれるテキストを、正しく処理できないものが多いんですよね。
今回はこのような要件を満たすようにしました。
- MySQLで動作する
- テーブルを指定できる
- 複数行のテキストフィールドを処理できる
- IDやモデルファイルが無いテーブル(HABTM用中間テーブルなど)に対応する
以下のようなファイルを、lib/tasks/extract_fixtures.rakeとして保存し、
rake db:fixtures:extract
すると、tmp/fixtures以下にテーブルごとのYAMLファイルが生成されるので、問題なさそうならspec/fixturesにmvすればOKです。
MySQLのDATETIME型でNOT NULLを指定した際など、0000-00-00といった値が入っている場合があり、これはActiveRecordを通すとnilになります。
このままYAMLにすると、fixtureを使うときに
ActiveRecord::StatementInvalid column 'date' cannot be null
などのエラーが発生してしまいます。そのため、NOT NULLカラムでNULLが見つかった場合は、空文字に変換しています。