From fde8e501997dafed7c931e5824959552f3a0481d Mon Sep 17 00:00:00 2001 From: Victor Costa Date: Wed, 5 Aug 2015 15:44:15 -0300 Subject: [PATCH] Move ranking logic to model --- lib/proposals_discussion_plugin/api.rb | 12 +----------- lib/proposals_discussion_plugin/proposals_holder.rb | 13 +++++++++++++ 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/proposals_discussion_plugin/api.rb b/lib/proposals_discussion_plugin/api.rb index fedf609..9c0cbc5 100644 --- a/lib/proposals_discussion_plugin/api.rb +++ b/lib/proposals_discussion_plugin/api.rb @@ -6,17 +6,7 @@ class ProposalsDiscussionPlugin::API < Grape::API get ':id/ranking' do article = find_article(environment.articles, params[:id]) ranking = Rails.cache.fetch("#{article.cache_key}/proposals_ranking", expires_in: 30.minutes) do - max_hits = article.proposals.maximum(:hits) - min_hits = article.proposals.minimum(:hits) - - proposals = article.proposals.map do |proposal| - w = [(proposal.hits - max_hits).abs, (proposal.hits - min_hits).abs, 1].max.to_f - effective_support = (proposal.votes_for - proposal.votes_against)/w - - {:id => proposal.id, :abstract => proposal.abstract, :votes_for => proposal.votes_for, :votes_against => proposal.votes_against, :hits => proposal.hits, :effective_support => effective_support} - end - proposals = proposals.sort_by { |p| p[:effective_support] }.reverse - {:proposals => proposals, :updated_at => DateTime.now} + {:proposals => article.ranking, :updated_at => DateTime.now} end ranking[:proposals] = paginate ranking[:proposals] ranking diff --git a/lib/proposals_discussion_plugin/proposals_holder.rb b/lib/proposals_discussion_plugin/proposals_holder.rb index 0d60b27..b26f0d0 100644 --- a/lib/proposals_discussion_plugin/proposals_holder.rb +++ b/lib/proposals_discussion_plugin/proposals_holder.rb @@ -40,6 +40,19 @@ class ProposalsDiscussionPlugin::ProposalsHolder < Folder end end + def ranking + max_hits = proposals.maximum(:hits) + min_hits = proposals.minimum(:hits) + + ranking = proposals.map do |proposal| + w = [(proposal.hits - max_hits).abs, (proposal.hits - min_hits).abs, 1].max.to_f + effective_support = (proposal.votes_for - proposal.votes_against)/w + + {:id => proposal.id, :abstract => proposal.abstract, :votes_for => proposal.votes_for, :votes_against => proposal.votes_against, :hits => proposal.hits, :effective_support => effective_support} + end + ranking.sort_by { |p| p[:effective_support] }.reverse + end + def cache_key_with_person(params = {}, user = nil, language = 'en') cache_key_without_person + (user ? "-#{user.identifier}" : '') end -- libgit2 0.21.2