Tech Racho エンジニアの「?」を「!」に。
  • 開発

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


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。