From 472340e540bd44b29296a4aa8267e7668d99ebd9 Mon Sep 17 00:00:00 2001 From: Florian Staudacher Date: Tue, 22 May 2012 18:20:56 +0200 Subject: [PATCH] add rake tasks for cleaning up mixed-case hashtags, fix querying tagged models, in case multiple tags are found ---- the first rake task will attach all posts tagged with mixed- case hashtags to their lower-case variant $ bundle exec rake migrations:rewire_uppercase_hashtags the other rake task will remove the - now unused - mixed-case hashtags from the db $ bundle exec rake migrations:remove_uppercase_hashtags as always, perform a backup first! ;) --- lib/stream/tag.rb | 4 ++-- lib/tasks/migrations.rake | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/lib/stream/tag.rb b/lib/stream/tag.rb index db6551db0..a1a096bed 100644 --- a/lib/stream/tag.rb +++ b/lib/stream/tag.rb @@ -52,11 +52,11 @@ class Stream::Tag < Stream::Base def construct_post_query posts = StatusMessage - if user.present? + if user.present? posts = posts.owned_or_visible_by_user(user) else posts = posts.all_public end - posts.tagged_with(tag_name) + posts.tagged_with(tag_name, :any => true) end end diff --git a/lib/tasks/migrations.rake b/lib/tasks/migrations.rake index 55bda548d..12dda744d 100644 --- a/lib/tasks/migrations.rake +++ b/lib/tasks/migrations.rake @@ -74,4 +74,39 @@ namespace :migrations do } end + + # removes hashtags with uppercase letters and re-attaches + # the posts to the lowercase version + task :rewire_uppercase_hashtags => :environment do + evil_tags = ActsAsTaggableOn::Tag.where("lower(name) != name") + puts "found #{evil_tags.count} tags to convert..." + + evil_tags.each_with_index do |tag, i| + good_tag = ActsAsTaggableOn::Tag.find_or_create_by_name(tag.name.downcase) + puts "++ '#{tag.name}' has #{tag.taggings.count} records attached" + deleteme = [] + + tag.taggings.each do |tagging| + deleteme << tagging + end + + deleteme.each do |tagging| + #tag.taggings.delete(tagging) + good_tag.taggings << tagging + end + + puts "-- converted '#{tag.name}' to '#{good_tag.name}' with #{deleteme.count} records" + puts "\n## #{i} tags processed\n\n" if (i % 50 == 0) + end + end + + task :remove_uppercase_hashtags => :environment do + evil_tags = ActsAsTaggableOn::Tag.where("lower(name) != name") + evil_tags.each do |tag| + next if tag.taggings.count > 0 # non-ascii tags + + puts "removing '#{tag.name}'..." + tag.destroy + end + end end