先日、日時は必要のない時間だけを扱うカラムを作成しようとして、初めてTime型という型を使ったのですが、そこで少しハマったので記事にしてみました。
Time型についてあまり知らない、使ってみたいよって方はぜひ読んでみてください。
環境
Rails7
PostgreSQL
起こったこと
コンソールで作成したTime型のカラムを含むテーブルを試しにコンソールで作成してみると、このようなデータが作成されてしまいました。
(対象カラムはstart_timeとend_timeです。)
Time型で作成したのに、なぜ?
DBで確認してみるとちゃんと時間だけが保存されてました。
理由
なぜだろうと思いググってみると、こちらの記事を見つけました。
https://blog.willnet.in/entry/2015/06/12/063731
Ruby や Rails には、時間のみを扱うクラスはありません。DB の Time 型は Ruby の Time オブジェクトに変換されます。Time オブジェクトは年月日の情報を持っています。その際、タイムゾーンは utc (正確には ActiveRecord::Base.default_timezone で設定されたタイムゾーン) として扱われます。
DBのTime型をRailsのTimeオブジェクトが日付を追加していたようでした。
そんな仕様があるとは…
最後に
DBの値をActiveStorage経由で出力する時にどう変換されるのかを意識したことがなかったので、良い機会でした。
DBの内容とActiveStorageを経由した出力結果は必ずしも一緒ではないというのを頭の片隅に入れながら、作業してきたいと思います。