class ReportController < ApplicationController def login_stat @logins = Array.new date_and_time = '%Y-%m-%d %H:%M' begin @since_time = DateTime.strptime(params[:since_datetime],date_and_time) rescue @since_time = DateTime.new(1000,1,1) end begin @until_time = DateTime.strptime(params[:until_datetime],date_and_time) rescue @until_time = DateTime.new(3000,1,1) end User.all.each do |user| @logins << { login: user.login, full_name: user.full_name, count: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?", user.id,@since_time,@until_time) .count(:id), min: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?", user.id,@since_time,@until_time) .minimum(:created_at), max: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?", user.id,@since_time,@until_time) .maximum(:created_at) } end end def submission_stat date_and_time = '%Y-%m-%d %H:%M' begin @since_time = DateTime.strptime(params[:since_datetime],date_and_time) rescue @since_time = DateTime.new(1000,1,1) end begin @until_time = DateTime.strptime(params[:until_datetime],date_and_time) rescue @until_time = DateTime.new(3000,1,1) end @submissions = {} User.find_each do |user| @submissions[user.id] = { login: user.login, full_name: user.full_name, count: 0, sub: { } } end Submission.where("submitted_at >= ? AND submitted_at <= ?",@since_time,@until_time).find_each do |s| if @submissions[s.user_id] if not @submissions[s.user_id][:sub].has_key?(s.problem_id) a = nil begin a = Problem.find(s.problem_id) rescue a = nil end @submissions[s.user_id][:sub][s.problem_id] = { prob_name: (a ? a.full_name : '(NULL)'), sub_ids: [s.id] } else @submissions[s.user_id][:sub][s.problem_id][:sub_ids] << s.id end @submissions[s.user_id][:count] += 1 end end end end