shimgo
12/4/2016 - 8:00 AM

DBでTime型カラムを使ったときに設定されるモデルの時間がおかしい

DBでTime型カラムを使ったときに設定されるモデルの時間がおかしい

###前提知識 railsが使う時間型にTimeWithZoneクラスがある。これはrailsで設定されたタイムゾーン
をもとにして時間を扱う。
DBのカラムをTime型に指定したモデルの属性はRubyのTime型になる。

###状況 リクエストパラメータ"1970-01-01 10:00:00 +0900"をTime型のモデルの属性にnewで渡したところ、
"2000-01-01 10:00:00 UTC"が生成されてしまう。
本当に生成したいのは"2000-01-01 01:00:00 UTC"

おそらくnewするときにRubyのTime型で10:00 +0900を生成した後、タイムゾーンだけUTCに変換されている。

ビューから明示的にUTCを渡せばうまく生成できるが、そうするとDB以外はJSTで扱うという方針に反してしまう。

###結論 DBにTime型を使っているということでこれは時間量を扱うものであるため、 ビューからは秒数を渡してコントローラでストロングパラメータによる検証を 行うときに秒数からUTCのTime型インスタンスをnewに渡すようにする。

しかし理想としてはDBにTime型が必要であってもdatetimeを使ったほうがわかりやすかったような気もする。