💰
月ごとのデータを取得して表示する(年・週・日も可能)
はじめに
売り上げなど月次データを取り出して表示したい場面があると思います。
今回は以下のような
・月次データの取得
・前の月、次の月へのページに移動可能
なページを作成したいと思います。
データは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
Discussion