月別に売上金額を集計し、画面に表示される処理を実装しております。
MonthReportに月毎の売上のレコードが入っております。
画面では
@reports = MonthReport.where(store_id: @user.stores.ids)
という風にしており、
ユーザーが保有している店舗で絞り込んだ、レポートを表示しているようにしております。
結果
#<MonthReport:0x007feaba88c668 id: 224, user_id: 2, store_id: 14, price: 2000, visit_count: 300, created_at: Sun, 24 Jul 2016 01:52:15 JST +09:00, updated_at: Sun, 24 Jul 2016 01:55:23 JST +09:00>, #<MonthReport:0x007feaba88c668 id: 225, user_id: 2, store_id: 15, price: 5000, visit_count: 400, created_at: Sun, 24 Jul 2016 01:52:15 JST +09:00, updated_at: Sun, 24 Jul 2016 01:55:23 JST +09:00>
今回やりたいこと
同じユーザーであれば、
店舗の売上(price)や訪問数(visit_count)の合計数を集計して、一レコードとして表示させることです。
※ また、今は、priceとvisit_countですが、今後、対象カラムは増える可能性あり。
試したこと
集計ということで調べていると、groupやgroup_byなどをつかって上手くできるのかと思い、いろいろと試しておりましたがダメでした。
@reports.group_by{|r|r.user_id}.each do |user| user.sum(:price) user.sum(:visit_count) end
@reports.group(:user_id).each do |user| user.sum(:price) user.sum(:visit_count) end
ユーザー毎でループしているのは、
運用側(私)が管理画面からみるときにも、ユーザー毎でみたいためです。
宜しくお願いします。
対象テーブル
| sales | CREATE TABLE `sales` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) DEFAULT NULL, `sales_price` int(11) DEFAULT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | | users | CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`), ) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | | stores | CREATE TABLE `stores` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`), ) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | MonthReport 'price' 'visit_count' 'store_id' 'user_id'
あなたの回答
tips
プレビュー