データ型の抽象表現
マイグレーションを使うとデータベース固有のデータ型に依存しない表現でスキーマの定義ができる。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かけると全部見れる。