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

Comments

utaさん、こんにちは。
なるほど、最初に考えるべきでしたね。遠回りしましたがまぁ勉強したということで納得です。早々、修正してアップしました。

リンクの方は確認しました。ありがとうございます。なんかちょっとうれしいような、恥ずかしいような...
本体の方もどんどんアップデートしているようで追いつくのが大変ですががんばってください。

hipposさんこんばんは、utaです。

コンポーネントのスキーマの変更方法ですが、
折角色々と試行錯誤して頂いた後に申し上げにくいのですが
Rubricks側で準備してあります。

/_install/db/002_xxxxx.rb を作って頂ければ、
コンポーネントアップデート実行時に自動的にスキーマを更新します。

但し、注意点として/_install/db/ 以下のファイルは全て
Class名が異なる必要があります。(これはRakeの仕様です)

具体的には、現状のrublogでは下記のようになっています。
/_install/db/001_rublog_schema.rb
/_update/schema/002_rublog_scema.rb

これを下記のように変更すればよろしいかと。
/_install/db/001_rublog_schema.rb
/_install/db/002_rublog_schema_2.rb

また、できれば002のスキーマファイルにもself.downを
書いておくことをお奨めします。