データをマイグレーションする「nondestructive_migrations」

Railsアプリを運用していると、DBスキーマの変更にあわせてデータも移し替えたりしたいこと、ありますよね。時には、DBスキーマと関係なく、一律データをリフレッシュさせるためにバッチを流したりすることもあるかと思います。

そういう場合はRakeタスクなんかを作成して流すと思うのですが、一度きり流すものをRakeタスクにするのも何だかなーと思うのと、かといってコンソールで直接流すのもなんだかなーという気持ちがあります。それを解決するのがnondestructive_migrationsです。

データのマイグレーション

DBのマイグレーションと同じように、データのマイグレーションを管理してくれる仕組みです。

class UpdatePhoneNumbers < ActiveRecord::Migration
  def up
    # データ変更のスクリプト
  end

  def down
    # 戻しのスクリプト
  end
end

こんな形で書けるので、もしデータの変更の仕方が間違えていたときなんかは、rake data:rollbackというコマンドで1つ前に戻ることができます。データの変更の仕方を間違えるといったことは、あんまり起きてほしくないですが・・・。

こういった仕組みを導入することで何が良いのかというと、どういったデータの変更を加えたかの履歴を管理できるところかなー、と思います。今までこんな変更を加えてきたよ、という変更管理のような感じですね。いざとなれば戻せるのも、良いと思います(ちゃんと戻すためのスクリプトが書けていれば、ですが・・・)。

ただ、こういったスクリプトを書くときに気をつけたいのは、アプリで実装しているモデルのメソッドを極力使わないようにする、ということだと思います。マイグレーションを書いた時点のモデルのコードと、マイグレーションを実行する時点のモデルのコードは変わっている可能性があるので、できればActiveRecordで用意されているメソッドだけでデータ変更スクリプトを書くのが良いと思います。

導入方法などは以下のリンク先のREADMEをご参考ください。

nondestructive_migrations