データ型の抽象表現

マイグレーションを使うとデータベース固有のデータ型に依存しない表現でスキーマの定義ができる。MySQLであれば、実際にはこんな定義になる。

抽象表記 Ruby MySQL
:primary_key Fixnum int(11) DEFAULT NULL auto_increment PRIMARY KEY
:string String varchar(255)
:text String text
:integer Fixnum int(11)
:float Float float
:datetime Time datetime
:timestamp Time datetime
:time Time datetime
:date Date date
:binary String blob
:boolean Object tinyint(1)

MySQLではtimestamp型のカラムは、形式はdatetimeと同じだけど、レコードを新規作成した時間が自動的に挿入される特殊な型になっている。Railsではこの機能が他のデータベースでも使えるように、あえてMySQL依存の機能を排除して、自前でその機能を実現している。具体的にはカラム名をcreated_atにするとそうなる。カラム名には他にもRails予約語があって、マジックカラムなどと呼ばれてるようだ。では:timestampとするとどうなるかというと、実際にはdatetimeが定義される。
上の表のような変換は、native_database_typesというメソッドで定義されているのだが、
http://api.rubyonrails.org/を見ても出てこない(なぜか# :nodoc:になっているため)。

C:\ruby\lib\ruby\gems\1.8\gems\activerecord-1.15.1\lib\active_record\connection_adapters
の各種データベースの名前がついたソースファイルの中に定義されているので、
「def native_database_types」でgrepかけると全部見れる。