reset_column_information

| コメント(0)

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をやり始めた人もやはり目を通しておくべき本だと思います。



コメントする

このブログ記事について

このページは、iwazerが2007年6月23日 22:13に書いたブログ記事です。

ひとつ前のブログ記事は「Windows版Safari」です。

次のブログ記事は「デバッグプリント」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。