概要

Railsを使っていて、データの保存された日付はcreated_atというカラムに保存されていますが、Twitterの日付のようにcreated_atを元に現在の日付からどれくらい前かを求めて表示したいということがありました。

どのようにして実現したのかを紹介します。

方法

helper内に現在の日付からどれくらい前かを求めるメソッドを書きました。引数にモデルのcreated_atなどのTimeクラス関連のインスタンスを指定します。

def relative_post_date(created_at)
  sec = (Time.zone.now - created_at).round
  days = sec / (60 * 60 * 24)
  return "#{days}d" unless days.zero?
  hours = sec / (60 * 60)
  return "#{hours}h" unless hours.zero?
  min = sec / 60
  return "#{min}m" unless min.zero?
  "#{sec}s"
end

考え方としては、最初に現在とデータを作成した日付の差分の秒数を求めます。

次に日にちを求めるために、一日の秒数を求めて(60 * 60 * 24)それで割ります。

次に時間を求めるために、一時間の秒数を求めて(60 * 60)それで割ります。

次に分を求めるために、1分間の秒数(60)で割ります。

このようにしているため、表示は差分が60秒未満なら秒、60分未満なら分、24時間未満なら時間、それ以外なら日数を表示します。

さいごに

表示に関してはもう少し賢いものがないかなとは思ったのですが、ひとまずはこれでよしとします。