From d71a4046613598701ee651a3ed04287868ec6479 Mon Sep 17 00:00:00 2001 From: kikito Date: Thu, 17 Sep 2015 16:53:21 +0200 Subject: [PATCH] Adds more methods to ActsAsTaggableOn --- config/initializers/acts_as_taggable_on.rb | 55 ++++++++++----- spec/lib/acts_as_taggable_on_spec.rb | 81 ++++++++++++++-------- 2 files changed, 90 insertions(+), 46 deletions(-) diff --git a/config/initializers/acts_as_taggable_on.rb b/config/initializers/acts_as_taggable_on.rb index ddf49482f..829b43725 100644 --- a/config/initializers/acts_as_taggable_on.rb +++ b/config/initializers/acts_as_taggable_on.rb @@ -1,24 +1,43 @@ -ActsAsTaggableOn::Tagging.class_eval do - after_create :increase_custom_counter - after_destroy :touch_taggable, :decrease_custom_counter +module ActsAsTaggableOn - def touch_taggable - taggable.touch if taggable.present? + Tagging.class_eval do + + after_create :increment_tag_custom_counter + after_destroy :touch_taggable, :decrement_tag_custom_counter + + def touch_taggable + taggable.touch if taggable.present? + end + + def increment_tag_custom_counter + tag.increment_custom_counter_for(taggable_type) + end + + def decrement_tag_custom_counter + tag.decrement_custom_counter_for(taggable_type) + end end - def increase_custom_counter - ActsAsTaggableOn::Tag.increment_counter(custom_counter_field_name, tag_id) + Tag.class_eval do + + def increment_custom_counter_for(taggable_type) + Tag.increment_counter(custom_counter_field_name_for(taggable_type), id) + end + + def decrement_custom_counter_for(taggable_type) + Tag.decrement_counter(custom_counter_field_name_for(taggable_type), id) + end + + def recalculate_custom_counter_for(taggable_type) + visible_taggables = taggable_type.constantize.includes(:taggings).where('taggings.taggable_type' => taggable_type, 'taggings.tag_id' => id) + + update(custom_counter_field_name_for(taggable_type) => visible_taggables.count) + end + + private + def custom_counter_field_name_for(taggable_type) + "#{taggable_type.underscore.pluralize}_count" + end end - def decrease_custom_counter - ActsAsTaggableOn::Tag.decrement_counter(custom_counter_field_name, tag_id) - end - - private - - def custom_counter_field_name - "#{self.taggable_type.underscore.pluralize}_count" - end - - end diff --git a/spec/lib/acts_as_taggable_on_spec.rb b/spec/lib/acts_as_taggable_on_spec.rb index f050da674..2362e8745 100644 --- a/spec/lib/acts_as_taggable_on_spec.rb +++ b/spec/lib/acts_as_taggable_on_spec.rb @@ -1,47 +1,72 @@ require 'rails_helper' -describe 'ActsAsTaggableOn::Tagging' do +describe 'ActsAsTaggableOn' do - describe "when tagging debates or proposals" do - let(:proposal) { create(:proposal) } - let(:debate) { create(:debate) } + describe 'Tagging' do + describe "when tagging debates or proposals" do + let(:proposal) { create(:proposal) } + let(:debate) { create(:debate) } - it "increases and decreases the tag's custom counters" do - tag = ActsAsTaggableOn::Tag.create(name: "foo") + it "increases and decreases the tag's custom counters" do + tag = ActsAsTaggableOn::Tag.create(name: "foo") - expect(tag.debates_count).to eq(0) - expect(tag.proposals_count).to eq(0) + expect(tag.debates_count).to eq(0) + expect(tag.proposals_count).to eq(0) - proposal.tag_list.add("foo") - proposal.save - tag.reload + proposal.tag_list.add("foo") + proposal.save + tag.reload - expect(tag.debates_count).to eq(0) - expect(tag.proposals_count).to eq(1) + expect(tag.debates_count).to eq(0) + expect(tag.proposals_count).to eq(1) - debate.tag_list.add("foo") - debate.save - tag.reload + debate.tag_list.add("foo") + debate.save + tag.reload - expect(tag.debates_count).to eq(1) - expect(tag.proposals_count).to eq(1) + expect(tag.debates_count).to eq(1) + expect(tag.proposals_count).to eq(1) - proposal.tag_list.remove("foo") - proposal.save - tag.reload + proposal.tag_list.remove("foo") + proposal.save + tag.reload - expect(tag.debates_count).to eq(1) - expect(tag.proposals_count).to eq(0) + expect(tag.debates_count).to eq(1) + expect(tag.proposals_count).to eq(0) - debate.tag_list.remove("foo") - debate.save - tag.reload + debate.tag_list.remove("foo") + debate.save + tag.reload - expect(tag.debates_count).to eq(0) - expect(tag.proposals_count).to eq(0) + expect(tag.debates_count).to eq(0) + expect(tag.proposals_count).to eq(0) + end end + end + describe 'Tag' do + describe "#recalculate_custom_counter_for" do + it "updates the counters of proposals and debates, taking into account hidden ones" do + tag = ActsAsTaggableOn::Tag.create(name: "foo") + + create(:proposal, tag_list: "foo") + create(:proposal, :hidden, tag_list: "foo") + + create(:debate, tag_list: "foo") + create(:debate, :hidden, tag_list: "foo") + + tag.update(debates_count: 0, proposals_count: 0) + + tag.recalculate_custom_counter_for('Debate') + expect(tag.debates_count).to eq(1) + + tag.recalculate_custom_counter_for('Proposal') + expect(tag.proposals_count).to eq(1) + end + end end + + end