diff --git a/config/initializers/acts_as_taggable_on.rb b/config/initializers/acts_as_taggable_on.rb index 7ad1bbb22..ddf49482f 100644 --- a/config/initializers/acts_as_taggable_on.rb +++ b/config/initializers/acts_as_taggable_on.rb @@ -1,8 +1,24 @@ ActsAsTaggableOn::Tagging.class_eval do - after_destroy :touch_taggable + after_create :increase_custom_counter + after_destroy :touch_taggable, :decrease_custom_counter def touch_taggable taggable.touch if taggable.present? end -end \ No newline at end of file + def increase_custom_counter + ActsAsTaggableOn::Tag.increment_counter(custom_counter_field_name, tag_id) + 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 new file mode 100644 index 000000000..f050da674 --- /dev/null +++ b/spec/lib/acts_as_taggable_on_spec.rb @@ -0,0 +1,47 @@ +require 'rails_helper' + +describe 'ActsAsTaggableOn::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") + + expect(tag.debates_count).to eq(0) + expect(tag.proposals_count).to eq(0) + + proposal.tag_list.add("foo") + proposal.save + tag.reload + + expect(tag.debates_count).to eq(0) + expect(tag.proposals_count).to eq(1) + + debate.tag_list.add("foo") + debate.save + tag.reload + + expect(tag.debates_count).to eq(1) + expect(tag.proposals_count).to eq(1) + + proposal.tag_list.remove("foo") + proposal.save + tag.reload + + expect(tag.debates_count).to eq(1) + expect(tag.proposals_count).to eq(0) + + debate.tag_list.remove("foo") + debate.save + tag.reload + + expect(tag.debates_count).to eq(0) + expect(tag.proposals_count).to eq(0) + end + + end + + +end