じぶんメモ

プログラミングのメモ、日常のメモとか。

Railsのマイグレーションファイルをまとめる

Railsで、テーブル構成を変更するたびに作成するマイグレーションファイルが増加しまくるので、
何か良い方法はないか調査した。
二つみつけた。Squasherが手軽な感じがする。

Squasherを使ってまとめる方法

お手軽なやつ。ただしdry runは対応していない模様。
まずはGemの取得。いつも通りGemfileに書いて、installする。

gem 'squasher'
bundle install

例えば、db/migrateディレクトリに以下のようにマイグレーションファイルがあったとする。

tomy2002:~/workspace/db/migrate $ ls
20150818134346_create_journals 20150918153823_add_column_to_journals

テーブル作成とカラム追加のマイグレーションファイルがそれぞれ存在する。
これらをsquaserで1つにまとめる。

tomy2002:~/workspace/db/migrate $ squasher 2016

上記で、2016/01/01以前に作成されたマイグレーションファイルを一つにまとめる。
年だけでなく、月・日付単位まで指定できる。(yyyy/mm/dd形式)
まとまった結果が以下のとおり。

tomy2002:~/workspace/db/migrate $ ls
20160207060023_init_schema.rb

あとはこれに対してrake db:migrateすればOK。

Ridgepoleを使った方法

rails標準のマイグレーションを使用しない方法。 このツールでは、DBスキーマはSchemafileと呼ばれるファイルに
ActiveRecord Schemaと同じDSLで記述しておく。

create_table "articles", force: :cascade do |t|
  t.string   "title"
  t.text     "text"
  t.datetime "created_at"
  t.datetime "updated_at"
end

カラムを修正する場合、Schemafileの定義を修正し、以下のコマンドを叩くだけでOK。

ridgepole -c config.yml --apply

ツールが自動的に変更点を識別し、マイグレーションを行ってくれる。
カラム名をリネームしたり、外部キーを追加したりもできる模様。

参考文献

Railsプロジェクトの初期開発フェーズでのDBスキーマ管理を見直す - TIM Labs

github.com