Merge pull request #429 from AyuntamientoMadrid/confidence_score
Confidence score
This commit is contained in:
@@ -83,7 +83,7 @@ class DebatesController < ApplicationController
|
||||
end
|
||||
|
||||
def parse_order
|
||||
@valid_orders = ['hot_score', 'created_at', 'score', 'most_commented', 'random']
|
||||
@valid_orders = ['confidence_score', 'hot_score', 'created_at', 'most_commented', 'random']
|
||||
@order = @valid_orders.include?(params[:order]) ? params[:order] : @valid_orders.first
|
||||
end
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ class WelcomeController < ApplicationController
|
||||
skip_authorization_check
|
||||
|
||||
def index
|
||||
@featured_debates = Debate.sort_by_hot_score.limit(3).for_render
|
||||
@featured_debates = Debate.sort_by_confidence_score.limit(3).for_render
|
||||
set_debate_votes(@featured_debates)
|
||||
end
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ class Debate < ActiveRecord::Base
|
||||
before_validation :sanitize_description
|
||||
before_validation :sanitize_tag_list
|
||||
|
||||
before_save :calculate_hot_score
|
||||
before_save :calculate_hot_score, :calculate_confidence_score
|
||||
|
||||
scope :sort_for_moderation, -> { order(flags_count: :desc, updated_at: :desc) }
|
||||
scope :pending_flag_review, -> { where(ignored_flag_at: nil, hidden_at: nil) }
|
||||
@@ -29,7 +29,7 @@ class Debate < ActiveRecord::Base
|
||||
scope :flagged, -> { where("flags_count > 0") }
|
||||
scope :for_render, -> { includes(:tags) }
|
||||
scope :sort_by_hot_score , -> { order(hot_score: :desc) }
|
||||
scope :sort_by_score , -> { order(cached_votes_score: :desc) }
|
||||
scope :sort_by_confidence_score , -> { order(confidence_score: :desc) }
|
||||
scope :sort_by_created_at, -> { order(created_at: :desc) }
|
||||
scope :sort_by_most_commented, -> { order(comments_count: :desc) }
|
||||
scope :sort_by_random, -> { order("RANDOM()") }
|
||||
@@ -130,6 +130,11 @@ class Debate < ActiveRecord::Base
|
||||
self.hot_score = ((age_in_units**2 + weighted_score)*1000).round
|
||||
end
|
||||
|
||||
def calculate_confidence_score
|
||||
return unless cached_votes_total > 0
|
||||
self.confidence_score = cached_votes_score * cached_votes_up / cached_votes_total
|
||||
end
|
||||
|
||||
def self.search(terms)
|
||||
terms.present? ? where("title ILIKE ? OR description ILIKE ?", "%#{terms}%", "%#{terms}%") : none
|
||||
end
|
||||
|
||||
@@ -71,9 +71,9 @@ en:
|
||||
select_order: Order by
|
||||
select_order_long: Order debates by
|
||||
orders:
|
||||
confidence_score: best rated
|
||||
hot_score: most active
|
||||
created_at: newest
|
||||
score: best rated
|
||||
most_commented: most commented
|
||||
random: random
|
||||
filter_topic:
|
||||
|
||||
@@ -71,9 +71,9 @@ es:
|
||||
select_order: Ordenar por
|
||||
select_order_long: Estás viendo los debates
|
||||
orders:
|
||||
confidence_score: "mejor valorados"
|
||||
hot_score: "más activos"
|
||||
created_at: "más nuevos"
|
||||
score: "mejor valorados"
|
||||
most_commented: "más comentados"
|
||||
random: "aleatorio"
|
||||
filter_topic:
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
class AddConfidenceScoreToDebates < ActiveRecord::Migration
|
||||
def change
|
||||
add_column :debates, :confidence_score, :integer, default: 0
|
||||
add_index :debates, :confidence_score
|
||||
end
|
||||
end
|
||||
@@ -11,7 +11,7 @@
|
||||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 20150907064631) do
|
||||
ActiveRecord::Schema.define(version: 20150908102936) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "plpgsql"
|
||||
@@ -102,12 +102,14 @@ ActiveRecord::Schema.define(version: 20150907064631) do
|
||||
t.integer "cached_anonymous_votes_total", default: 0
|
||||
t.integer "cached_votes_score", default: 0
|
||||
t.integer "hot_score", limit: 8, default: 0
|
||||
t.integer "confidence_score", default: 0
|
||||
end
|
||||
|
||||
add_index "debates", ["cached_votes_down"], name: "index_debates_on_cached_votes_down", using: :btree
|
||||
add_index "debates", ["cached_votes_score"], name: "index_debates_on_cached_votes_score", using: :btree
|
||||
add_index "debates", ["cached_votes_total"], name: "index_debates_on_cached_votes_total", using: :btree
|
||||
add_index "debates", ["cached_votes_up"], name: "index_debates_on_cached_votes_up", using: :btree
|
||||
add_index "debates", ["confidence_score"], name: "index_debates_on_confidence_score", using: :btree
|
||||
add_index "debates", ["hidden_at"], name: "index_debates_on_hidden_at", using: :btree
|
||||
add_index "debates", ["hot_score"], name: "index_debates_on_hot_score", using: :btree
|
||||
|
||||
|
||||
@@ -78,6 +78,10 @@ FactoryGirl.define do
|
||||
before(:save) { |d| d.calculate_hot_score }
|
||||
end
|
||||
|
||||
trait :with_confidence_score do
|
||||
before(:save) { |d| d.calculate_confidence_score }
|
||||
end
|
||||
|
||||
trait :conflictive do
|
||||
after :create do |debate|
|
||||
Flag.flag(FactoryGirl.create(:user), debate)
|
||||
|
||||
@@ -359,10 +359,10 @@ feature 'Debates' do
|
||||
|
||||
feature 'Debate index order filters' do
|
||||
|
||||
scenario 'Default order is hot_score', :js do
|
||||
create(:debate, title: 'best').update_column(:hot_score, 10)
|
||||
create(:debate, title: 'worst').update_column(:hot_score, 2)
|
||||
create(:debate, title: 'medium').update_column(:hot_score, 5)
|
||||
scenario 'Default order is confidence_score', :js do
|
||||
create(:debate, title: 'best').update_column(:confidence_score, 10)
|
||||
create(:debate, title: 'worst').update_column(:confidence_score, 2)
|
||||
create(:debate, title: 'medium').update_column(:confidence_score, 5)
|
||||
|
||||
visit debates_path
|
||||
|
||||
@@ -370,20 +370,20 @@ feature 'Debates' do
|
||||
expect('medium').to appear_before('worst')
|
||||
end
|
||||
|
||||
scenario 'Debates are ordered by best rated', :js do
|
||||
create(:debate, title: 'best', cached_votes_score: 10)
|
||||
create(:debate, title: 'medium', cached_votes_score: 5)
|
||||
create(:debate, title: 'worst', cached_votes_score: 2)
|
||||
scenario 'Debates are ordered by hot_score', :js do
|
||||
create(:debate, title: 'best').update_column(:hot_score, 10)
|
||||
create(:debate, title: 'worst').update_column(:hot_score, 2)
|
||||
create(:debate, title: 'medium').update_column(:hot_score, 5)
|
||||
|
||||
visit debates_path
|
||||
select 'best rated', from: 'order-selector'
|
||||
select 'most active', from: 'order-selector'
|
||||
|
||||
within '#debates.js-order-score' do
|
||||
within '#debates.js-order-hot-score' do
|
||||
expect('best').to appear_before('medium')
|
||||
expect('medium').to appear_before('worst')
|
||||
end
|
||||
|
||||
expect(current_url).to include('order=score')
|
||||
expect(current_url).to include('order=hot_score')
|
||||
end
|
||||
|
||||
scenario 'Debates are ordered by most commented', :js do
|
||||
|
||||
@@ -17,4 +17,15 @@ feature "Home" do
|
||||
|
||||
end
|
||||
|
||||
scenario "Order by confidence score" do
|
||||
create(:debate, confidence_score: 100, title: 'best')
|
||||
create(:debate, confidence_score: -20, title: 'worst')
|
||||
create(:debate, confidence_score: 50, title: 'medium')
|
||||
|
||||
visit root_path
|
||||
|
||||
expect('best').to appear_before('medium')
|
||||
expect('medium').to appear_before('worst')
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -236,6 +236,43 @@ describe Debate do
|
||||
expect(previous).to be < debate.hot_score
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#confidence_score" do
|
||||
|
||||
it "takes into account percentage of total votes and total_positive and total negative votes" do
|
||||
debate = create(:debate, :with_confidence_score, cached_votes_up: 100, cached_votes_score: 100, cached_votes_total: 100)
|
||||
expect(debate.confidence_score).to eq(100)
|
||||
|
||||
debate = create(:debate, :with_confidence_score, cached_votes_up: 0, cached_votes_score: -100, cached_votes_total: 100)
|
||||
expect(debate.confidence_score).to eq(0)
|
||||
|
||||
debate = create(:debate, :with_confidence_score, cached_votes_up: 50, cached_votes_score: 50, cached_votes_total: 100)
|
||||
expect(debate.confidence_score).to eq(25)
|
||||
|
||||
debate = create(:debate, :with_confidence_score, cached_votes_up: 500, cached_votes_score: 500, cached_votes_total: 1000)
|
||||
expect(debate.confidence_score).to eq(250)
|
||||
|
||||
debate = create(:debate, :with_confidence_score, cached_votes_up: 10, cached_votes_score: -80, cached_votes_total: 100)
|
||||
expect(debate.confidence_score).to eq(-8)
|
||||
end
|
||||
|
||||
describe 'actions which affect it' do
|
||||
let(:debate) { create(:debate, :with_confidence_score) }
|
||||
|
||||
it "increases with like" do
|
||||
previous = debate.confidence_score
|
||||
5.times { debate.register_vote(create(:user), true) }
|
||||
expect(previous).to be < debate.confidence_score
|
||||
end
|
||||
|
||||
it "decreases with dislikes" do
|
||||
debate.register_vote(create(:user), true)
|
||||
previous = debate.confidence_score
|
||||
3.times { debate.register_vote(create(:user), false) }
|
||||
expect(previous).to be > debate.confidence_score
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user