質問編集履歴

1

他モデルのクラスメソッドで意図するデータを得る事はできました。

2020/04/20 12:59

投稿

t.togashi
t.togashi

スコア22

test CHANGED
File without changes
test CHANGED
@@ -88,13 +88,9 @@
88
88
 
89
89
  def self.group_monthly_chart_data
90
90
 
91
-   # {"A": {[2019, 4]=>○○○○, [2019, 5]=>○○○○, …}, "B": … } のようにまとめたいです
91
+   # {"A": {[2019, 4]=>○○○○, [2019, 5]=>○○○○, …}, "B": … } のようにまとめたいですが...
92
92
 
93
- group_year_and_month_minute_data = Overtime.joins(:user).group("user.group")
93
+ group_year_and_month_minute_data = Overtime.joins(:user).select("overtimes*, users*").group(:group).group("extract(year from date)").group("extract(month from date)").sum(:work_time_minute)
94
-
95
-
96
-
97
-
98
94
 
99
95
  end
100
96
 
@@ -106,15 +102,73 @@
106
102
 
107
103
 
108
104
 
109
-
110
-
111
105
  ### 発生している問題
112
106
 
113
107
  月毎の合計残業時間をまとめるクラスメソッドを、個人毎の場合は上記の通り作成できました。
114
108
 
115
- 一方グループ毎の場合は、`join`を使用してuser,overtime2つのテブルを結合する必要がある事わかったもののこれ降どように記述すれば良いのかわかりせんでした
109
+ 一方グループ毎の場合は、上記ドでは、以エラーメッセージ
116
110
 
117
- お手数ですが、記述方法をご教示いただきたいです。
111
+ ```
112
+
113
+ pry(main)> Overtime.joins(:user).select("overtimes*, users*").group(:group).group("extract(year from date)").group("extract(month from date)").sum(:work_time_minute) (2.4ms) SELECT SUM(`overtimes`.`work_time_minute`) AS sum_work_time_minute, `group` AS group, extract(year from date) AS extract_year_from_date, extract(month from date) AS extract_month_from_date FROM `overtimes` INNER JOIN `users` ON `users`.`id` = `overtimes`.`user_id` GROUP BY `group`, extract(year from date), extract(month from date)
114
+
115
+ ActiveRecord::StatementInvalid: Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group, extract(year from date) AS extract_year_from_date, extract(month from dat' at line 1: SELECT SUM(`overtimes`.`work_time_minute`) AS sum_work_time_minute, `group` AS group, extract(year from date) AS extract_year_from_date, extract(month from date) AS extract_month_from_date FROM `overtimes` INNER JOIN `users` ON `users`.`id` = `overtimes`.`user_id` GROUP BY `group`, extract(year from date), extract(month from date)
116
+
117
+ ```
118
+
119
+
120
+
121
+ ### 試した事
122
+
123
+ Overtimeのクラスメソッドとして記述した結果、上記のようにエラーが出たため、Userのクラスメソッドとして記述した場合はどうなのかを試してみました。
124
+
125
+ すると、以下のように望んでいる形に近しい結果が得られました。
126
+
127
+ ```
128
+
129
+ pry(main)> User.joins(:overtimes).select("overtimes*, users*").group(:group).group("extract(year from date)").group("extract(month from date)").sum(:work_time_minute)
130
+
131
+ (4.0ms) SELECT SUM(work_time_minute) AS sum_work_time_minute, `users`.`group` AS users_group, extract(year from date) AS extract_year_from_date, extract(month from date) AS extract_month_from_date FROM `users` INNER JOIN `overtimes` ON `overtimes`.`user_id` = `users`.`id` GROUP BY `users`.`group`, extract(year from date), extract(month from date)
132
+
133
+ => {["A", 2019, 4]=>1828,
134
+
135
+ ["A", 2019, 5]=>6418,
136
+
137
+ ["A", 2019, 6]=>6247,
138
+
139
+ ["A", 2019, 7]=>4820,
140
+
141
+ ["A", 2019, 8]=>4033,
142
+
143
+ ["A", 2019, 9]=>6835,
144
+
145
+ ["A", 2019, 10]=>6717,
146
+
147
+ ["A", 2019, 11]=>5469,
148
+
149
+ ["A", 2019, 12]=>4882,
150
+
151
+ ["A", 2020, 1]=>4365,
152
+
153
+ ["A", 2020, 2]=>6504,
154
+
155
+ ["A", 2020, 3]=>5693,
156
+
157
+ ["A", 2020, 4]=>2593,
158
+
159
+ ["B", 2019, 4]=>1414,
160
+
161
+ ["B", 2019, 5]=>4339,
162
+
163
+ ["B", 2019, 6]=>5215,
164
+
165
+ ["B", 2019, 7]=>3992, ...
166
+
167
+ ```
168
+
169
+
170
+
171
+ データの性格上、UserではなくOvertimeのクラスメソッドで上記の結果を得たいのですが、どのように記述すれば同様の結果が得られるかわからないため、お手数ですがご教示いただきたいです。
118
172
 
119
173
 
120
174
 
@@ -122,4 +176,6 @@
122
176
 
123
177
  ### 参考にした情報
124
178
 
125
- [参考サイト](https://qiita.com/eRy-sk/items/a1bc2714eeb55e05bcc0)
179
+ [参考サイト](https://qiita.com/eRy-sk/items/a1bc2714eeb55e05bcc0)
180
+
181
+ [参考サイト2](https://qiita.com/yuyasat/items/c2ad37b5a24a58ee3d30)