2007年06月23日
■reset_column_information
DBマイグレーションで既に存在するテーブルにカラムを追加後、そこに他の項目値によってデフォルト値を自動で突っ込みたくなり、少々はまりましたので、覚え書き。
Hogeというモデルがあり、progressという項目に0 .. 9の範囲で進捗度が格納されているとする。
progressの9は完了なのだが、9に設定された日を格納するcomplete_dateというdate型の項目を追加したい。既存のレコードにはprogressが9で、complete_dateがNULLの場合、complete_dateに今日の日付を入れる。
で、マイグレーションでは普通にRubyのコードも書ける様なので、こんな風にしてみた。
class AlterHoges < ActiveRecord::Migration
def self.up
add_column :hoges, :complete_date, :date
Hoge.update_all "complete_date = now()", "progress = 9 AND complete_date is null"
end
def self.down
remove_column :hoges, :complete_date
end
end
しかし、うまくいかない。小一時間んで、RailsによるアジャイルWebアプリケーション開発のマイグレーションの項目を読み直して見たところ、発見。
モデルの変更があったことをActiveRecordに知らせないといけない。よく考えると当たり前だ。具体的には下記をadd_columnとupdate_allの間に挟むということ。
Hoge.reset_column_information
RailsによるアジャイルWebアプリケーション開発はRails0.9ベースに書かれていて、脚注と付録で1.0をサポートしている、結構古めの内容だが、Railsの全体と、重要なイディオムを習得するために最近Railsをやり始めた人もやはり目を通しておくべき本だと思います。
コメント