Commit fde8e501997dafed7c931e5824959552f3a0481d

Authored by Victor Costa
1 parent bc3e832e

Move ranking logic to model

lib/proposals_discussion_plugin/api.rb
@@ -6,17 +6,7 @@ class ProposalsDiscussionPlugin::API < Grape::API @@ -6,17 +6,7 @@ class ProposalsDiscussionPlugin::API < Grape::API
6 get ':id/ranking' do 6 get ':id/ranking' do
7 article = find_article(environment.articles, params[:id]) 7 article = find_article(environment.articles, params[:id])
8 ranking = Rails.cache.fetch("#{article.cache_key}/proposals_ranking", expires_in: 30.minutes) do 8 ranking = Rails.cache.fetch("#{article.cache_key}/proposals_ranking", expires_in: 30.minutes) do
9 - max_hits = article.proposals.maximum(:hits)  
10 - min_hits = article.proposals.minimum(:hits)  
11 -  
12 - proposals = article.proposals.map do |proposal|  
13 - w = [(proposal.hits - max_hits).abs, (proposal.hits - min_hits).abs, 1].max.to_f  
14 - effective_support = (proposal.votes_for - proposal.votes_against)/w  
15 -  
16 - {:id => proposal.id, :abstract => proposal.abstract, :votes_for => proposal.votes_for, :votes_against => proposal.votes_against, :hits => proposal.hits, :effective_support => effective_support}  
17 - end  
18 - proposals = proposals.sort_by { |p| p[:effective_support] }.reverse  
19 - {:proposals => proposals, :updated_at => DateTime.now} 9 + {:proposals => article.ranking, :updated_at => DateTime.now}
20 end 10 end
21 ranking[:proposals] = paginate ranking[:proposals] 11 ranking[:proposals] = paginate ranking[:proposals]
22 ranking 12 ranking
lib/proposals_discussion_plugin/proposals_holder.rb
@@ -40,6 +40,19 @@ class ProposalsDiscussionPlugin::ProposalsHolder < Folder @@ -40,6 +40,19 @@ class ProposalsDiscussionPlugin::ProposalsHolder < Folder
40 end 40 end
41 end 41 end
42 42
  43 + def ranking
  44 + max_hits = proposals.maximum(:hits)
  45 + min_hits = proposals.minimum(:hits)
  46 +
  47 + ranking = proposals.map do |proposal|
  48 + w = [(proposal.hits - max_hits).abs, (proposal.hits - min_hits).abs, 1].max.to_f
  49 + effective_support = (proposal.votes_for - proposal.votes_against)/w
  50 +
  51 + {:id => proposal.id, :abstract => proposal.abstract, :votes_for => proposal.votes_for, :votes_against => proposal.votes_against, :hits => proposal.hits, :effective_support => effective_support}
  52 + end
  53 + ranking.sort_by { |p| p[:effective_support] }.reverse
  54 + end
  55 +
43 def cache_key_with_person(params = {}, user = nil, language = 'en') 56 def cache_key_with_person(params = {}, user = nil, language = 'en')
44 cache_key_without_person + (user ? "-#{user.identifier}" : '') 57 cache_key_without_person + (user ? "-#{user.identifier}" : '')
45 end 58 end