わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

ActiveRecordでtime

ここんところ,ActiveRecordを使って(ただし,Railsは使わずに)データベースにアクセスするアプリケーションを作っています.
それで,時刻情報の登録がどうもおかしいことに気付きました.それで,テーブルを作る処理を見てみると,次のように書いていました.

create_table(:samples) do |t|
  # 中略
  t.column :at, :time
end

「:time」は文字通り「時刻」だけで,年月日の情報が入らないのが原因でした.そういえば値を取り出したとき,時分秒は寸分の狂いもないのに対して,年月日が異常なのでした.
「:datetime」または「:timestamp」とすればいいのですね.さて,どっちのほうがいいんだったっけ.
使っているDBMSPostgreSQLなのですが,timestamp型とdatetime型のどちらかが古いものだったと記憶しています…もう少し調査しました.datetime型は,http://www.postgresql.jp/document/pg721doc/user/datatype-datetime.htmlにはありますが,

7.0 より以前の PostgreSQL バージョンからのアップグレードを確実にするために datetime (timestamp と同じ)と timespan (interval と同じ)も認めています。現在これらのデータ型は timestamp とinterval への暗黙的な翻訳が制限されており、次の PostgreSQL のリリース(たぶん 7.3)では削除されるでしょう。

となっています.そして,http://www.postgresql.jp/document/pg825doc/html/datatype-datetime.htmlには,datetime型は出てきません.
まあActiveRecordで変換されているのですし,TableDefinition#columnの例で「t.column "created_at", :datetime」というのがありますし,「:datetime」のほうがいいみたいですね.http://dontstopmusic.no-ip.org/diary/20050920.htmlでも,同じ結論になっていました.
そういえば「ActiveRecordで変換」ってどうやっているのだろう? 少し検索すると,postgresql_adapter.rbのコードを知ることができました.手元の,activerecord-2.0.2/lib/active_record/connection_adapters/postgresql_adapter.rb と比べると,定義の行の後ろに「 #:nodoc:」がついているものの,メソッドの本体(型のマッピング)はまったく同じでした 255 }」のも自分にとっては要注意です.「:strning」を割り当てていて,255バイトを超えて文字列を格納すると,不具合が起こるということで.">*1

*1:このマッピングで,「:string => { :name => "character varying", :limit => 255 }」のも自分にとっては要注意です.「:strning」を割り当てていて,255バイトを超えて文字列を格納すると,不具合が起こるということで.