小ネタ
直近の n 月を取得したい。例えば 10 月なら、今日(7 月 10 日)から一番近いのは 2018 年 10 月、という感じ。
お題は単純に思えるけど、意外とスキッと書けない。
Rails のDateをみても、翌月とか前月とか、n ヶ月前とか取得するメソッドはあれど、直近 n 月を取得するメソッドはない。
思いついたままやる
とりあえず何も考えず愚直に書いてみる
def closest_month(target_month, date) |
この長さならワンライナーでもいい気がするな…
def closest_month(target_month, date) |
if文を排除
if文というか、三項演算子で条件判定が入っているのがなんか気になる。
対象の月が前だろうと後だろうと同じ式から導き出せないだろうか?と思って考えた。
def closest_month(target_month, date) |
ちょっと複雑かな?と思うので解説
month_array = (target_month..12).to_a + (1...target_month).to_a
ここで、例えばtarget_month
が10
とすると[10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9]
という配列が得られる。
この配列から、当月のindexを引くと対象月との差分が得られる。
つまり当月が7月なら、index=9
になるので、9ヶ月前が対象月の10月になる。
なので、date.prev_month(month_array.index(date.month)).beginning_of_month
で差分だけ前の月を取得するという形だ。
うーん、なんかうまいことやってる感は出たけど
最初のワンライナーがシンプルでわかりやすいかも。
もう少し簡素に
[対象月から始まる配列].index(現在月) = 差分
という式で上の計算式は成り立っていてが[0〜11の配列][現在月 - 対象月] = 差分
という式でもいける。こっちのほうがちょっと短いかな
def closest_month(target_month, date) |
少しシンプルになった。。。気がする。
でも最初のワンライナーがわかりやすいかなぁ。