refactors voted debates

This commit is contained in:
rgarcia
2015-08-15 14:57:41 +02:00
parent 4751954377
commit 9f2d60c4ce
7 changed files with 73 additions and 24 deletions

View File

@@ -37,7 +37,7 @@ class ApplicationController < ActionController::Base
end end
end end
def set_voted_values(debates_ids) def set_debate_votes(debates)
@voted_values = current_user ? current_user.votes_on_debates(debates_ids) : {} @voted_values = current_user ? current_user.debate_votes(debates) : {}
end end
end end

View File

@@ -3,17 +3,12 @@ class DebatesController < ApplicationController
load_and_authorize_resource load_and_authorize_resource
def index def index
if params[:tag] @debates = Debate.search(params)
@debates = Debate.tagged_with(params[:tag]).order(id: :desc) set_debate_votes(@debates)
set_voted_values @debates.map(&:id)
else
@debates = Debate.all.order(id: :desc)
set_voted_values @debates.map(&:id)
end
end end
def show def show
set_voted_values [@debate.id] set_debate_votes(@debate)
end end
def new def new
@@ -40,7 +35,7 @@ class DebatesController < ApplicationController
def vote def vote
@debate.vote_by(voter: current_user, vote: params[:value]) @debate.vote_by(voter: current_user, vote: params[:value])
set_voted_values [@debate.id] set_debate_votes(@debate)
end end

View File

@@ -2,8 +2,8 @@ class WelcomeController < ApplicationController
skip_authorization_check skip_authorization_check
def index def index
@featured_debates = Debate.order("created_at DESC").limit(9) @featured_debates = Debate.limit(9)
set_voted_values @featured_debates.map(&:id) set_debate_votes(@featured_debates)
end end
end end

View File

@@ -13,12 +13,9 @@ class User < ActiveRecord::Base
use_nickname? ? nickname : "#{first_name} #{last_name}" use_nickname? ? nickname : "#{first_name} #{last_name}"
end end
def votes_on_debates(debates_ids = []) def debate_votes(debates)
debates_ids = debates_ids.flatten.compact.uniq voted = votes.for_debates.in(debates)
return {} if debates_ids.empty? voted.each_with_object({}) { |v,_| _[v.votable_id] = v.value }
voted = votes.where("votable_type = ? AND votable_id IN (?)", "Debate", debates_ids)
voted.each_with_object({}){ |v,_| _[v.votable_id] = v.vote_flag }
end end
def administrator? def administrator?

View File

@@ -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

View File

@@ -2,13 +2,11 @@ require 'rails_helper'
describe User do describe User do
describe "#votes_on_debates" do describe "#debate_votes" do
let(:user) { create(:user) } let(:user) { create(:user) }
it "returns {} if no debate" do it "returns {} if no debate" do
expect(user.votes_on_debates()).to eq({}) expect(user.debate_votes([])).to eq({})
expect(user.votes_on_debates([])).to eq({})
expect(user.votes_on_debates([nil, nil])).to eq({})
end end
it "returns a hash of debates ids and votes" do 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: debate1, vote_flag: true)
create(:vote, voter: user, votable: debate3, vote_flag: false) 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[debate1.id]).to eq(true)
expect(voted[debate2.id]).to eq(nil) expect(voted[debate2.id]).to eq(nil)

46
spec/models/vote_spec.rb Normal file
View File

@@ -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