Rails には Time 型、Date 型、Duration 型など時間に関わらる様々な型があり、その全てに様々なエイリアスが生えています。
様々なユースケースにおいて、日付演算が読みやすくなるように配慮された結果だと思いますが、時たま難解な組み合わせに出会うことがあります。極端な例ですが、3.days.from_now(Time.current.yesterday)
などのような感じです。正直いつの時点を指しているのかパット見でよくわかりません。
実は読みやすさだけを考えた場合、選べる選択肢はそれほど多くありません。
その読みやすくなるパターンについてまとめてみたいと思います。
シフトさせる時間や日数が具体的にわかっている場合
Duration 型に対して対象の日付を渡す方法が最も自然に読めると思います。
具体例としては、
3.days.from_now # 3日後
3.days.ago # 3日後
3.days.after(some_event) # some_event から3日後
3.days.before(some_event) # some_event の3日前
です。since
や until
などもありますが、これは継続を表したいパターンで明らかに上手くハマる、みたいなケースを除いて使う必要は無いかなと思います。
パターンは以下のとおりです。
起点\表す時点 | 過去 | 未来 |
---|---|---|
現在 | ago | from_now |
過去・未来 | before | after |
シフト先の時間はわかっているが具体的な差がわかっていない場合
言ってしまえば、Duration オブジェクトを定義しづらい場合です。
この場合はもちろん Date や Time に対して、メソッド呼び出しを行います。
Time.current.noon # 正午
Time.current.beginning_of_week # 週初め
実はこちらの場合では特に言うことがありません。
まとめ
- Duration を使える場合は Duration へのメソッド呼び出しにする (e.g.
3.days.ago
) - Duration に対して使うメソッドは基本
ago
,from_now
,before
,after
の4つで良い - Duration を使えない場合のみ、Time や Date へのメソッド呼び出しを行う