ino-akiのブログ

ITエンジニアを目指して学習したことをアウトプットするブログ

Dateクラス wdayメソッド

よくわからなかったので、ChatGPTに解説してもらいました

 

@todays_date = Date.today

Date.todayはRuby の Date クラスのメソッドで、現在の日付を返す

現在の日付を@todays_dateというインスタンス変数に格納しています

 

wdaysとは、曜日の日本語表記を保持する配列です

この配列は、以下のように日本語の曜日表記を要素として持ちます
wdays = ['(日)', '(月)', '(火)', '(水)', '(木)', '(金)', '(土)']

これにより、曜日の番号に応じて日本語の曜日が取得できます

wdays[0] は (日)、wdays[1] は (月) というように、0から6までの番号に対応する日本語の曜日が取得できます

 

plans = Plan.where(date: @todays_date..@todays_date + 6)

Plan モデルから特定の期間内の予定を検索するために使用されます

Plan モデルの where メソッドが使われています

where メソッドは、条件に一致するレコードを取得するために使用されます

条件は date 属性が @todays_date(今日の日付)から @todays_date + 6(今日から6日後)の範囲内にあることです

つまり、@todays_date から @todays_date + 6 までの期間内にある予定をすべて plans 変数に格納します。これにより、1週間分の予定が取得されます。

 

7.times do |x|
これは、0から6までの整数 x を使って7回繰り返すループです。x は、今日から数えて何日後の日付かを表します

 

today_plans = []
これは、現在の日付に関連する予定を格納するための空の配列 today_plans を作成します

 

plans.each do |plan|
  today_plans.push(plan.plan) if plan.date == @todays_date + x
end
plans.each は、plans 配列内の各要素(予定)に対して繰り返し処理を行います
条件 if plan.date == @todays_date + x は、その予定の日付が指定された日付に一致するかどうかを確認します
一致する場合、その予定の内容 plan.plan が today_plans 配列に追加されます

 

wday_num = Date.today.wday + x
if wday_num >= 7
  wday_num = wday_num -7
end

Date.today.wday は、現在の曜日を表す整数を返します。0 が日曜日、1 が月曜日、...、6 が土曜日を表します
x を加えることで、現在の曜日から x 日後の曜日を表す整数 wday_num を計算します
if wday_num >= 7 は、計算された曜日が7以上(つまり土曜日以降)かどうかをチェックします
もし7以上であれば、wday_num から 7 を引いて正しい範囲(0から6)に収めます
つまり、この部分のコードは、指定された日数後の曜日を計算し、土曜日以降の場合は週の最初に戻るように調整する処理を行います

 

days = { month: (@todays_date + x).month, date: (@todays_date + x).day, plans: today_plans, wday: wdays[wday_num]}
@week_days.push(days)
month: (@todays_date + x).month は、x 日後の日付の月を表します
date: (@todays_date + x).day は、x 日後の日付の日を表します
plans: today_plans は、x 日後の日付の予定を表します。today_plans 配列にはその日の予定が格納されています
wday: wdays[wday_num] は、x 日後の日付の曜日を表します。wday_num をインデックスとして wdays 配列から曜日の日本語表記を取得します
これらの情報を持つハッシュ days を作成し、そのハッシュを @week_days 配列に追加することで、1週間分の日付ごとの情報が @week_days 配列に格納されます

 

感想

こうして上から順に一つずつコードを確認していくと少しではありますが理解できたような気がします。