From 6e022528a081ea87cf7af01652eed3cc7f940660 Mon Sep 17 00:00:00 2001 From: Maximilian Grundke Date: Wed, 28 Feb 2018 13:41:47 +0100 Subject: [PATCH] Move methods to model --- .../request_for_comments_controller.rb | 33 +++++++------------ app/models/request_for_comment.rb | 16 ++++++++- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/app/controllers/request_for_comments_controller.rb b/app/controllers/request_for_comments_controller.rb index 2f8219a9..e6e4ad2e 100644 --- a/app/controllers/request_for_comments_controller.rb +++ b/app/controllers/request_for_comments_controller.rb @@ -14,43 +14,34 @@ class RequestForCommentsController < ApplicationController def index @search = RequestForComment .last_per_user(2) - .joins('join "submissions" s on s.id = request_for_comments.submission_id - left outer join "files" f on f.context_id = s.id - left outer join "comments" on comments.file_id = f.id') - .group('request_for_comments.id, request_for_comments.user_id, request_for_comments.exercise_id, - request_for_comments.file_id, request_for_comments.question, request_for_comments.created_at, - request_for_comments.updated_at, request_for_comments.user_type, request_for_comments.solved, - request_for_comments.full_score_reached, request_for_comments.submission_id, request_for_comments.row_number') # ugly, but rails wants it this way - .select('request_for_comments.*, max(comments.updated_at) as last_comment') + .with_last_activity .search(params[:q]) - @request_for_comments = @search.result.order('created_at DESC').paginate(page: params[:page], total_entries: @search.result.length) + @request_for_comments = @search.result + .order('created_at DESC') + .paginate(page: params[:page], total_entries: @search.result.length) authorize! end def get_my_comment_requests @search = RequestForComment + .with_last_activity .where(user_id: current_user.id) - .joins('join "submissions" s on s.id = request_for_comments.submission_id - left outer join "files" f on f.context_id = s.id - left outer join "comments" on comments.file_id = f.id') - .group('request_for_comments.id') - .select('request_for_comments.*, max(comments.updated_at) as last_comment') .search(params[:q]) - @request_for_comments = @search.result.order('created_at DESC').paginate(page: params[:page]) + @request_for_comments = @search.result + .order('created_at DESC') + .paginate(page: params[:page]) render 'index' end def get_rfcs_with_my_comments @search = RequestForComment + .with_last_activity .joins(:comments) # we don't need to outer join here, because we know the user has commented on these .where(comments: {user_id: current_user.id}) - .joins('join "submissions" s on s.id = request_for_comments.submission_id - left outer join "files" f on f.context_id = s.id - left outer join "comments" as c on c.file_id = f.id') - .group('request_for_comments.id') - .select('request_for_comments.*, max(c.updated_at) as last_comment') .search(params[:q]) - @request_for_comments = @search.result.order('last_comment DESC').paginate(page: params[:page]) + @request_for_comments = @search.result + .order('last_comment DESC') + .paginate(page: params[:page]) render 'index' end diff --git a/app/models/request_for_comment.rb b/app/models/request_for_comment.rb index d0c300b6..d00d08eb 100644 --- a/app/models/request_for_comment.rb +++ b/app/models/request_for_comment.rb @@ -10,7 +10,13 @@ class RequestForComment < ActiveRecord::Base scope :unsolved, -> { where(solved: [false, nil]) } def self.last_per_user(n = 5) - from("(#{row_number_user_sql}) as request_for_comments").where("row_number <= ?", n) + from("(#{row_number_user_sql}) as request_for_comments") + .where("row_number <= ?", n) + .group('request_for_comments.id, request_for_comments.user_id, request_for_comments.exercise_id, + request_for_comments.file_id, request_for_comments.question, request_for_comments.created_at, + request_for_comments.updated_at, request_for_comments.user_type, request_for_comments.solved, + request_for_comments.full_score_reached, request_for_comments.submission_id, request_for_comments.row_number') + # ugly, but necessary end # not used right now, finds the last submission for the respective user and exercise. @@ -46,6 +52,14 @@ class RequestForComment < ActiveRecord::Base commenters.uniq {|user| user.id} end + def self.with_last_activity + self.joins('join "submissions" s on s.id = request_for_comments.submission_id + left outer join "files" f on f.context_id = s.id + left outer join "comments" c on c.file_id = f.id') + .group('request_for_comments.id') + .select('request_for_comments.*, max(c.updated_at) as last_comment') + end + def to_s "RFC-" + self.id.to_s end