kakudooo docs

日付が必須で時刻が任意のデータの取り扱い

概要

日付が必須で時刻が任意なフィールドのフォーム実装することがある。そのような場合に、RDBのDate型とTime型のカラムにそれぞれ分けて入力値を保存したいがRubyではdate or datetime形式のクラスしかないため、Time型のカラムを参照する際にはdatetime形式に変換されてしまう。

また、タイムゾーンに関して

ことになり、時刻型のありなしに応じて、適切な日付もしくは日時データで扱われるようアプリケーションを実装してやる必要がある。

日付が必須で時刻が任意な入力値を扱う場合の方法について整理したスクラップ的なやつ。

時刻を時刻フォーマットで管理する方法

1. フラグでdate or datetime形式を管理する

そもそもRubyの世界にない時刻形式のデータを使わない。テーブルのカラムをDate型、DateTime型、フラグ値で構成して、入力に応じて保存先や参照先のカラムを変える。入力値の組み合わせに該当しない方のカラムはNULLを入れておいてもいい

2. 独自のデータ構造を定義する

時刻は時刻フォーマットで管理することができるデータ構造を定義して使用する。 tod gemなどが使えそう

日付をutcに変換する方法

日付で入力値が送られてくるとタイムゾーンの変換はできない。 そのため、Date型のカラムとTime型のカラムそれぞれで入力値を管理することは難しい。

推奨

日付が必須で時刻が任意なフィールドのフォーム実装する場合は、1.のフラグでdate or datetime形式を管理する方法を採用する、タイムゾーンに関する考慮ポイントが少なくシンプルでよさそう。 日付はそのままカラムに保存して使うし、日時はRailsのTimeWithZoneクラスを使っていれば変換される。 仕様にもよるが、日付カラムと日時カラムを同じ検索条件で検索はで基本できない前提にはなる。 日付カラムの検索と日時カラムの検索を分けられるようにする。

参考