前提・実現したいこと
Ruby on Railsで残業時間を管理するシステムを作っています。
このシステムにおいて、月毎の残業合計時間を集計し、時系列でグラフとして表示しています。
該当のソースコード
overtime.rb
rb
1class Overtime < ApplicationRecord 2 (略) 3 def self.monthly_chart_data(userid) 4 # {[2019, 4]=>○○○○, [2019, 5]=>○○○○, …} を生成 5 year_and_month_minute_data = Overtime.where(user_id: userid).group("extract(year from date)").group("extract(month from date)").sum(:work_time_minute) 6 monthly_hour_data = {} 7 year_and_month_minute_data.each do |key, value| 8 monthly_hour_data["#{key[0].floor}年#{key[1].floor}月"] = value / 60 9 end 10 monthly_hour_data 11 end 12 (略) 13end
users_controller.rb
rb
1class UsersController < ApplicationController 2 (略) 3 def show 4 @user = User.find(params[:id]) 5 gon.monthly_chart_data = Overtime.monthly_chart_data(params[:id]) 6 end 7 (略) 8end
発生している問題・エラーメッセージ
users showアクションに対応するviewにて、ブラウザの検証機能を利用し、controller から受け取った gon.monthly_chart_data
の内容を確認すると、
開発環境においては、
window.gon={};gon.monthly_chart_data={"2019年4月":35,"2019年5月":45,"2019年6月":22,"2019年7月":51,"2019年8月":43,"2019年9月":41,"2019年10月":50,"2019年11月":49,"2019年12月":24,"2020年1月":36,"2020年2月":31,"2020年3月":36,"2020年4月":25};
というように意図通り時間順になっているのですが、
本番環境においては、
window.gon={};gon.monthly_chart_data={"2020年1月":14,"2019年8月":34,"2019年12月":31,"2019年7月":28,"2019年4月":12,"2020年2月":31,"2019年11月":36,"2019年5月":8,"2019年10月":27,"2019年6月":11,"2019年9月":26,"2020年4月":12,"2020年3月":26};
と、開発環境と異なり、時間順になっていません。
(それぞれの月に対応する時間数は、seed.dataの投入時にランダムに決定されるため、開発環境と本番環境とで同一にはなりません。)
このデータで時系列のグラフにする際、ハッシュの中身が開発環境のように時間順になっていると大変都合が良いです。
ついてはお手数ですが、
(1)なぜこのようにハッシュ内の順番に差異が生じるのか
(2)本番環境のハッシュ内の順番を開発環境と同様に時間順にする方法
をそれぞれご教示いただきたいです。
補足情報(FW/ツールのバージョンなど)
開発環境 MySQL
本番環境 PostgreSQL
回答1件
あなたの回答
tips
プレビュー