用户运用数据按照用户数默认排序

video_log
daiao 5 years ago
parent 8a1cc73de5
commit 6b7a7f38b8

@ -9,7 +9,7 @@ class Admins::UserSchoolsStatisticsController < Admins::BaseController
end end
def index def index
default_sort('finish_challenge_count', 'desc') default_sort('cnt', 'desc')
total_count, schools = Admins::UserSchoolsStatisticQuery.call(params) total_count, schools = Admins::UserSchoolsStatisticQuery.call(params)
@schools = paginate schools, total_count: total_count @schools = paginate schools, total_count: total_count

@ -3,15 +3,15 @@ class Admins::UserSchoolsStatisticQuery < ApplicationQuery
attr_reader :params attr_reader :params
sort_columns :study_challenge_count, :finish_challenge_count, :study_shixun_count, :finish_shixun_count, sort_columns :cnt,
default_by: :finish_challenge_count, default_direction: :desc default_by: :cnt, default_direction: :desc
def initialize(params) def initialize(params)
@params = params @params = params
end end
def call def call
schools = School.all schools = School
if params[:province].present? if params[:province].present?
schools = schools.where("province like ?", "%#{params[:province]}%") schools = schools.where("province like ?", "%#{params[:province]}%")
end end
@ -21,15 +21,15 @@ class Admins::UserSchoolsStatisticQuery < ApplicationQuery
end end
total = schools.count total = schools.count
Rails.logger.info("######:#{total}")
# 根据排序字段进行查询 # 根据排序字段进行查询
#schools = query_by_sort_column(schools, params[:sort_by]) schools = query_by_sort_column(schools.group(:id), params[:sort_by])
#schools = custom_sort(schools, params[:sort_by], params[:sort_direction]) #schools = custom_sort(schools, params[:sort_by], params[:sort_direction])
#
schools = schools.limit(page_size).offset(offset).to_a schools = schools.limit(page_size).offset(offset).to_a
# 查询并组装其它数据 # 查询并组装其它数据
schools = package_other_data(schools) schools = package_other_data(schools)
Rails.logger.info("######:#{total}")
Rails.logger.info("######:#{schools.inspect}")
[total, schools] [total, schools]
end end
@ -83,56 +83,14 @@ class Admins::UserSchoolsStatisticQuery < ApplicationQuery
schools schools
end end
def query_by_sort_column(users, sort_by_column) def query_by_sort_column(schools, sort_by_column)
base_query_column = 'users.*' #base_query_column = 'schools.*'
case sort_by_column.to_s case sort_by_column.to_s
when 'study_shixun_count' then when 'cnt' then
users = schools.left_joins(:user_extensions).select("schools.*, count(*) cnt").order("cnt desc")
if time_range.present?
users.joins("LEFT JOIN myshixuns ON myshixuns.user_id = users.id "\
"AND myshixuns.updated_at BETWEEN '#{time_range.min}' AND '#{time_range.max}'")
else
users.left_joins(:myshixuns)
end
users.select("#{base_query_column}, COUNT(*) study_shixun_count")
when 'finish_shixun_count' then
users =
if time_range.present?
users.joins("LEFT JOIN myshixuns ON myshixuns.user_id = users.id AND myshixuns.status = 1 AND "\
"myshixuns.updated_at BETWEEN '#{time_range.min}' AND '#{time_range.max}'")
else
users.joins('LEFT JOIN myshixuns ON myshixuns.user_id = users.id AND myshixuns.status = 1')
end
users.select("#{base_query_column}, COUNT(*) finish_shixun_count")
when 'study_challenge_count' then
users =
if time_range.present?
users.joins('LEFT JOIN myshixuns ON myshixuns.user_id = users.id')
.joins("LEFT JOIN games ON games.myshixun_id = myshixuns.id "\
"AND games.status IN (0,1,2) AND games.updated_at BETWEEN '#{time_range.min}' AND '#{time_range.max}'")
else
users.joins('LEFT JOIN myshixuns ON myshixuns.user_id = users.id')
.joins("LEFT JOIN games ON games.myshixun_id = myshixuns.id AND games.status IN (0,1,2)")
end
users.select("#{base_query_column}, COUNT(*) study_challenge_count")
when 'finish_challenge_count' then
users =
if time_range.present?
users#.joins('LEFT JOIN myshixuns ON myshixuns.user_id = users.id')
.joins("LEFT JOIN games ON games.user_id = users.id "\
"AND games.status = 2 AND games.updated_at BETWEEN '#{time_range.min}' AND '#{time_range.max}'")
else
users#.joins('LEFT JOIN myshixuns ON myshixuns.user_id = users.id')
.joins("LEFT JOIN games ON games.user_id = users.id AND games.status = 2")
end
users.select("#{base_query_column}, COUNT(*) finish_challenge_count")
else else
users schools
end end
end end

Loading…
Cancel
Save