Rubricksコンポーネントのスキーマ更新

rublogコンポーネントのバージョンアップの開発もそろそろ区切りを付けようと思っているのですが、スキーマのアップデートの方法でしばらくの間悩んでいました。なにしろ行き当たりばったりの開発なのでスキーマの変更がたくさんあって、この変更をどう処理したものかうまい方法が見つからず思案していたわけなんです。Railsのスキーマ管理のやり方としてはActiveRecord::Migrationを使用するのが素直なことはわかっていたのですがこれだとアプリケーション全体のバージョンに影響が出てしまいます。かといって別途SQLを用意してユーザにコマンドを打たせるのも今ひとつスマートじゃない気がして。

そこで、思い当たったのがRubricks本体のコンポーネントのインストール。この時もMigrationを使用しているはずなので同様の問題が発生しているはずなのですがこれをどんな風に回避しているのか?コードを見てみました。そしたらなんと、いったんschema_infoのバージョンを0にしてmigrate、そしてその後元に戻すというシンプルなやり方をしていました。実はこのテ、最初に考えた事は考えたのですがちょっと反則気味な気がして二の足を踏んでいたのですが、Rubricks本体がこうしているならお墨つきってことでこの方法を採用することにしました。

後は、InstallationScriptのafter_updateにMigratorを仕込んで、

def after_update
  rsi = RubricksSchemaInfo.find_all.first
  system_current_schema_version = rsi.version
  begin
    rsi.version = 0
    rsi.save
    ActiveRecord::Migrator.migrate("#{RAILS_ROOT}/components/rublog/...")
  rescue Exception
    $stderr.puts $!.message
    exit 1
  ensure
   rsi.version = system_current_schema_version
   rsi.save
  end
end

でアップデートしてみたらちゃんとスキーマ更新できました。ホッ。近日中にアップデートできそうです。(誰もつかっていないのでホントはこんな処理不要なんですけど....)

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/76

返信