Adds more methods to ActsAsTaggableOn

This commit is contained in:
kikito
2015-09-17 16:53:21 +02:00
parent fedefa215f
commit d71a404661
2 changed files with 90 additions and 46 deletions

View File

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

View File

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