From 4751954377c7b50a7def25d268deb4057aa37234 Mon Sep 17 00:00:00 2001 From: rgarcia Date: Sat, 15 Aug 2015 14:57:04 +0200 Subject: [PATCH 1/2] refactors debate search --- app/models/debate.rb | 10 ++++++++++ spec/models/debate_spec.rb | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/app/models/debate.rb b/app/models/debate.rb index fe75811fa..3a4f37e7d 100644 --- a/app/models/debate.rb +++ b/app/models/debate.rb @@ -1,5 +1,7 @@ require 'numeric' class Debate < ActiveRecord::Base + default_scope { order('created_at DESC') } + apply_simple_captcha TITLE_LENGTH = Debate.columns.find{|c| c.name == 'title'}.limit @@ -18,6 +20,14 @@ class Debate < ActiveRecord::Base before_validation :sanitize_description before_validation :sanitize_tag_list + def self.search(params) + if params[:tag] + tagged_with(params[:tag]) + else + all + end + end + def likes get_likes.size end diff --git a/spec/models/debate_spec.rb b/spec/models/debate_spec.rb index 187bc0dc1..d5a193386 100644 --- a/spec/models/debate_spec.rb +++ b/spec/models/debate_spec.rb @@ -78,4 +78,28 @@ describe Debate do end end + describe "#search" do + let!(:economy) { create(:debate, tag_list: "Economy") } + let!(:health) { create(:debate, tag_list: "Health") } + + it "returns debates tagged with params tag" do + params = {tag: "Economy"} + expect(Debate.search(params)).to match_array([economy]) + end + + it "returns all debates if no parameters" do + params = {} + expect(Debate.search(params)).to match_array([economy, health]) + end + end + + describe '#default_order' do + let!(:economy) { create(:debate) } + let!(:health) { create(:debate) } + + it "returns debates ordered by last one first" do + expect(Debate.all).to eq([health, economy]) + end + end + end From 9f2d60c4ce514ca8b40150cc667806758de7c9cc Mon Sep 17 00:00:00 2001 From: rgarcia Date: Sat, 15 Aug 2015 14:57:41 +0200 Subject: [PATCH 2/2] refactors voted debates --- app/controllers/application_controller.rb | 4 +- app/controllers/debates_controller.rb | 13 ++----- app/controllers/welcome_controller.rb | 4 +- app/models/user.rb | 9 ++--- config/initializers/vote_extensions.rb | 13 +++++++ spec/models/user_spec.rb | 8 ++-- spec/models/vote_spec.rb | 46 +++++++++++++++++++++++ 7 files changed, 73 insertions(+), 24 deletions(-) create mode 100644 config/initializers/vote_extensions.rb create mode 100644 spec/models/vote_spec.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 550fbcf2e..4321c1708 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -37,7 +37,7 @@ class ApplicationController < ActionController::Base end end - def set_voted_values(debates_ids) - @voted_values = current_user ? current_user.votes_on_debates(debates_ids) : {} + def set_debate_votes(debates) + @voted_values = current_user ? current_user.debate_votes(debates) : {} end end diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index 3b61becc2..98756f78a 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -3,17 +3,12 @@ class DebatesController < ApplicationController load_and_authorize_resource def index - if params[:tag] - @debates = Debate.tagged_with(params[:tag]).order(id: :desc) - set_voted_values @debates.map(&:id) - else - @debates = Debate.all.order(id: :desc) - set_voted_values @debates.map(&:id) - end + @debates = Debate.search(params) + set_debate_votes(@debates) end def show - set_voted_values [@debate.id] + set_debate_votes(@debate) end def new @@ -40,7 +35,7 @@ class DebatesController < ApplicationController def vote @debate.vote_by(voter: current_user, vote: params[:value]) - set_voted_values [@debate.id] + set_debate_votes(@debate) end diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index 40cf13510..923609fab 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -2,8 +2,8 @@ class WelcomeController < ApplicationController skip_authorization_check def index - @featured_debates = Debate.order("created_at DESC").limit(9) - set_voted_values @featured_debates.map(&:id) + @featured_debates = Debate.limit(9) + set_debate_votes(@featured_debates) end end \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb index 6857d981c..2799dae8c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -13,12 +13,9 @@ class User < ActiveRecord::Base use_nickname? ? nickname : "#{first_name} #{last_name}" end - def votes_on_debates(debates_ids = []) - debates_ids = debates_ids.flatten.compact.uniq - return {} if debates_ids.empty? - - voted = votes.where("votable_type = ? AND votable_id IN (?)", "Debate", debates_ids) - voted.each_with_object({}){ |v,_| _[v.votable_id] = v.vote_flag } + def debate_votes(debates) + voted = votes.for_debates.in(debates) + voted.each_with_object({}) { |v,_| _[v.votable_id] = v.value } end def administrator? diff --git a/config/initializers/vote_extensions.rb b/config/initializers/vote_extensions.rb new file mode 100644 index 000000000..4bbf48d20 --- /dev/null +++ b/config/initializers/vote_extensions.rb @@ -0,0 +1,13 @@ +ActsAsVotable::Vote.class_eval do + def self.for_debates + where(votable_type: 'Debate') + end + + def self.in(debates) + where(votable_id: debates) + end + + def value + vote_flag + end +end \ No newline at end of file diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 36444a9c5..10191576b 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -2,13 +2,11 @@ require 'rails_helper' describe User do - describe "#votes_on_debates" do + describe "#debate_votes" do let(:user) { create(:user) } it "returns {} if no debate" do - expect(user.votes_on_debates()).to eq({}) - expect(user.votes_on_debates([])).to eq({}) - expect(user.votes_on_debates([nil, nil])).to eq({}) + expect(user.debate_votes([])).to eq({}) end it "returns a hash of debates ids and votes" do @@ -18,7 +16,7 @@ describe User do create(:vote, voter: user, votable: debate1, vote_flag: true) create(:vote, voter: user, votable: debate3, vote_flag: false) - voted = user.votes_on_debates([debate1.id, debate2.id, debate3.id]) + voted = user.debate_votes([debate1, debate2, debate3]) expect(voted[debate1.id]).to eq(true) expect(voted[debate2.id]).to eq(nil) diff --git a/spec/models/vote_spec.rb b/spec/models/vote_spec.rb new file mode 100644 index 000000000..41fcf8471 --- /dev/null +++ b/spec/models/vote_spec.rb @@ -0,0 +1,46 @@ +require 'rails_helper' + +describe 'Vote' do + + describe '#for_debates' do + it 'returns votes for debates' do + debate = create(:debate) + create(:vote, votable: debate) + + expect(Vote.for_debates.count).to eq(1) + end + + it 'does not returns votes for other votables' do + comment = create(:comment) + create(:vote, votable: comment) + + expect(Vote.for_debates.count).to eq(0) + end + end + + describe '#in' do + it 'returns debates send in parameters' do + debate = create(:debate) + create(:vote, votable: debate) + + expect(Vote.in(debate).count).to eq(1) + end + + it 'does not return debates not in parameters' do + debate = create(:debate) + create(:vote, votable: debate) + + expect(Vote.in([]).count).to eq(0) + end + end + + describe '#value' do + it 'returns vote flag' do + vote = create(:vote, vote_flag: true) + expect(vote.value).to eq(true) + + vote = create(:vote, vote_flag: false) + expect(vote.value).to eq(false) + end + end +end \ No newline at end of file