RailsでDBからFixtureを作成する

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が見つかった場合は、空文字に変換しています。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。得意分野はWeb全般、Ruby on Rails、Androidアプリケーションなど。最近はBlinkと格闘中。軽度の資格マニアで、情報処理技術者試験(高度10区分)などを保有。

babaの書いた記事

週刊Railsウォッチ

インフラ

Rubyスタイルガイドを読む

BigBinary記事より

ActiveSupport探訪シリーズ