マイグレーションとモデル

開発がガンガン進んで、仕様もガンガン変更されて、重要なテーブルにガンガン変更がかかった場合の話。そのテーブルにマッピングされているモデルに書かれているコードは、古いマイグレーションを書いたときに想定していたものと全く違うものになることもあります。そういう場合、テーブルを作り直したれや!と古いマイグレーションまで一度戻って再度作り直す、ということをやるとロクに通らないことが起こりえます。


これを避けるためには、慎重に開発を進めて、そんな不整合が起こらないように細心の注意を払うか、モデルをその時点のスキーマのバージョンに合わせて、作るかのどちらかかなと思いました。
スキーマのバージョンにあわせるためには以下のようなコードを書けばOKなはず。

class User < ActiveRecord::Base
  if self.columns.any?{|column| column.name == 'birthday' }
    def age
      ・・・
    end
  else 
    # 古いバージョンではageをデータとして持ってしまっている
  end
end

あまり良い例じゃないですけど、スキーマによって必要なメソッドも変わるはずなので、こういうやり方もありかなと。でも、複雑になりやすいので避けたいところです。みんなどうしているんだろう?