Adds more methods to ActsAsTaggableOn
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user