💰

月ごとのデータを取得して表示する(年・週・日も可能)

2021/05/02に公開

はじめに

売り上げなど月次データを取り出して表示したい場面があると思います。
今回は以下のような
・月次データの取得
・前の月、次の月へのページに移動可能
なページを作成したいと思います。
データはOrderとします。

routeの準備

# route.rb
Rails.application.routes.draw do
.
.
  get 'report', to: 'orders#report'
end

controllerでの処理

class OrdersController < ApplicationController
  def report
    # クエリストリングがあればTimeオブジェクトに変換、ない場合は現在の時刻を取得
    @month = params[:month] ? Date.parse(params[:month]) : Time.zone.today
    # 取得した時刻が含まれる月の範囲のデータを取得
    @orders = Order.where(updated_at: @month.all_month)
  end
end

二行目の
@month.all_month部分のall_monthメソッドはレシーバーのTimeオブジェクトが含まれる月のrangeを返すので、それにより月次データを簡単に取得することが可能となります。

view(前の月と次の月のリンク)

# report.html.erb
<%= link_to "前の月のリンク",report_path(month:@month.prev_month) %>
<%= link_to "次の月のリンク",report_path(month:@month.next_month) %>

データを整形してviewで表示すれば、月次データ用のページの完成です。

日・週・年ごとのデータの場合

お察しの通り、以下のような方法でTimeオブジェクトが含まれるレンジを取得可能です。

# 日のレンジ
Time.parse("2017-9-1").all_day
=> 2017-09-01 00:00:00 +0900..2017-09-01 23:59:59 +0900

# 週のレンジ
Time.parse("2017-9-1").all_week
=> 2017-08-28 00:00:00 +0900..2017-09-03 23:59:59 +0900

# 年のレンジ
Time.parse("2017-9-1").all_year
=> 2017-01-01 00:00:00 +0900..2017-12-31 23:59:59 +0900

参考

16 Timeの拡張

Discussion