diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index 791b355a7..8d7f1be28 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -23,6 +23,7 @@ class TagsController < ApplicationController def update @tag = Tag.find(params[:id]) @tag.update_attributes(params[:tag]) + @tag.update_category_cache_for_all respond_with(@tag) end end diff --git a/app/models/tag.rb b/app/models/tag.rb index df7594ebb..7be0e2675 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -1,7 +1,6 @@ class Tag < ActiveRecord::Base METATAGS = "-user|user|-approver|approver|-pool|pool|-fav|fav|sub|md5|-rating|rating|width|height|mpixels|score|filesize|source|id|date|order|status|tagcount|gentags|arttags|chartags|copytags|parent|pixiv" attr_accessible :category - after_save :update_category_cache_for_all has_one :wiki_page, :foreign_key => "name", :primary_key => "title" module ApiMethods @@ -84,24 +83,23 @@ class Tag < ActiveRecord::Base Danbooru.config.reverse_tag_category_mapping[category] end - def update_category_cache_for_all(force = false) - if category_changed? || force - update_category_cache - delay(:queue => "default").update_category_post_counts if category_changed? - - Danbooru.config.other_server_hosts.each do |host| - delay(:queue => host).update_category_cache - end + def update_category_cache_for_all + Danbooru.config.all_server_hosts.each do |host| + delay(:queue => host).update_category_cache end + + delay(:queue => "default").update_category_post_counts end def update_category_post_counts - old_field = "tag_count_#{Danbooru.config.reverse_tag_category_mapping[category_was]}".downcase - new_field = "tag_count_#{category_name}".downcase - if old_field != new_field - Post.without_timeout do - Post.raw_tag_match(name).update_all("#{old_field} = #{old_field} - 1, #{new_field} = #{new_field} + 1") - end + Post.raw_tag_match(name).find_each do |post| + post.reload + post.set_tag_counts + post.update_column(:tag_count, post.tag_count) + post.update_column(:tag_count_general, post.tag_count_general) + post.update_column(:tag_count_artist, post.tag_count_artist) + post.update_column(:tag_count_copyright, post.tag_count_copyright) + post.update_column(:tag_count_character, post.tag_count_character) end end @@ -138,7 +136,7 @@ class Tag < ActiveRecord::Base if category_id != tag.category tag.update_column(:category, category_id) - tag.update_category_cache_for_all(true) + tag.update_category_cache_for_all end end diff --git a/script/fixes/006.rb b/script/fixes/006.rb new file mode 100644 index 000000000..205e94806 --- /dev/null +++ b/script/fixes/006.rb @@ -0,0 +1,14 @@ +#!/usr/bin/env ruby + +require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'config', 'environment')) + +Post.where("created_at > '2013-02-01'").find_each do |post| + puts "Fixing #{post.id}" + post.reload + post.set_tag_counts + post.update_column(:tag_count, post.tag_count) + post.update_column(:tag_count_general, post.tag_count_general) + post.update_column(:tag_count_artist, post.tag_count_artist) + post.update_column(:tag_count_copyright, post.tag_count_copyright) + post.update_column(:tag_count_character, post.tag_count_character) +end diff --git a/test/unit/tag_test.rb b/test/unit/tag_test.rb index c3e83407b..6cdd21a5c 100644 --- a/test/unit/tag_test.rb +++ b/test/unit/tag_test.rb @@ -91,9 +91,11 @@ class TagTest < ActiveSupport::TestCase should "reset its category after updating" do tag = FactoryGirl.create(:artist_tag) + tag.update_category_cache_for_all assert_equal(Tag.categories.artist, MEMCACHE.get("tc:#{tag.name}")) - + tag.update_attribute(:category, Tag.categories.copyright) + tag.update_category_cache_for_all assert_equal(Tag.categories.copyright, MEMCACHE.get("tc:#{tag.name}")) end end