ブログ

読んで思い出す。忘れるために書く

Q. 渡された日付から7日分の日付表記を生成したい (日付操作)

A. Railsactivesupport gem にある Date#advance を使う (ドキュメント)

Tips: Gemfilerails と書かなくても gem 'activesupport' と単体で利用できる


テストコードと実装

テストコード

describe SevenDays do
  context '2019年2月3日(日) が渡された場合' do
    subject { SevenDays.build(base_date) }

    let(:base_date) { Date.new(2019, 2, 3) }

    it '2月3日(日) から 2月9日(土) までの配列が返る' do
      expected =
        %w[
          2月3日(日)
          2月4日(月)
          2月5日(火)
          2月6日(水)
          2月7日(木)
          2月8日(金)
          2月9日(土)
        ]

      expect(subject).to eq expected
    end
  end
end

実装

require 'active_support/core_ext/date/calculations'

# 7日分の日付を生成する
class SevenDays
  class << self
    # 与えられた日付から「2月3日(日)」形式の日付表記文字列を7日分生成する
    def build(base_date)
      one_week = (0..6)

      one_week.map { |increment| base_date.advance(days: increment) }
              .map(&method(:format))
    end

    private

    # 「2月3日(日)」形式の日付表記に変換する
    def format(date)
      weekday = date_to_weekday(date)
      date.strftime("%-m月%-d日(#{weekday})")
    end

    # 日付からその日の曜日を導出
    def date_to_weekday(date)
      %w[日 月 火 水 木 金 土].values_at(date.wday).first
    end
  end
end

Links