質問: Overtime.monthly_chart_data(params[:id]) end (略) end ``` ### 発生している問題・エラーメッセージ 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
回答: > > ハッシュの中身が開発環境のように時間順になっていると大変都合が良いです。 > > > そもそも論として、JavaScriptの世界では、ハッシュの順番は**尊重される保証がありません**(いちおう、順序はES2020で固定されるに至りましたが、ユーザーが完全対応したブラウザを使っているとも限りません)。 JavaScriptレベルで対応したいなら、JavaScript側でソートをかけることになります。もしくはRubyから渡す時点で、順番を決め打ちできるように配列としておくかです。