雀巽の日記帳

雀巽が綴る日常の記録

Rails の Time#since で混乱したのでまとめる

Rails というか ActiveSupport の Time#since で混乱しました。

これまでに混乱した since の使われ方一覧はこちら。

time.since(2.days)
time.since(-2.days)
2.days.since

ぜ、全部わけわかんねぇ……。

とりあえず -2.days は疲れてた故の過ちだったぽいので良いです。 しかしやはり、time.since(2.days)2.days.since もぶっちゃけよくわかりません。

ActiveSupport の Time 拡張は、基本的に英語力に自信がなくても直感的に読める場合が多かったのですが、正直この since の使い方はよくわからなかったので調べました。

since(seconds)

Returns a new Time representing the time a number of seconds since the instance time

Also aliased as: in

Time#since

要するに、time.since(2.days) はこの説明通りに読むと、2 days since the time となるようです。

完全に場所が入れ替わってる……これはわかりにくいはずですね。

これの alias は Time#in らしいので、それを使えば time.in(2.days) となりスッキリ書けます。超わかりやすい。

で、次は 2.days.since のターン。これまた全然わからん。

というわけで、調べます。

since(time = ::Time.now)

Reads best with argument: 10.minutes.since(time)

This method is also aliased as from_now

Module: ActiveSupport::CoreExtensions::Numeric::Time#since

引数ついてると読みやすい的なことが書いてあるとおり、たしかに引数があるならわかりやすそうです。

ただ、引数がない場合は alias の from_now を使ったほうが遥かに意味が明瞭ですね。

まとめると、

time.since(2.days) # => time.in(2.days) or 2.days.since(time)
2.days.since # => 2.days.from_now

ということですね。

こっちのほうがわかりやすい!!