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