A. Rails の activesupport gem にある Date#advance
を使う (ドキュメント)
Tips: Gemfile
に rails と書かなくても gem 'activesupport'
と単体で利用できる
- Ruby on Rails のコアライブラリの一つ →Ruby on Rails 続きを読む
- このキーワードを含むブログを見る
テストコードと実装
テストコード
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