036_add_tag_display_name.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:2k
源码类别:

Ajax

开发平台:

Others

  1. class AddTagDisplayName < ActiveRecord::Migration
  2.   class Tag < ActiveRecord::Base
  3.     has_and_belongs_to_many :articles
  4.   end
  5.   class Content < ActiveRecord::Base
  6.   end
  7.   class Article < Content
  8.     has_and_belongs_to_many :tags
  9.   end
  10.   def self.up
  11.     STDERR.puts 'Adding display name to tags'
  12.     modify_tables_and_update(:add_column, Tag, :display_name, :string) do
  13.       unless $schema_generator
  14.         Tag.find(:all).each do |tag|
  15.           tag.display_name = tag.name
  16.           tag.name = tag.name.tr(' ', '').downcase
  17.           if tag.name != tag.display_name
  18.             # we need to make sure we're not attempting to create duplicate-named tags
  19.             # if so, we need to coalesce them
  20.             # Hopefully this code isn't necessary, but somebody may have tags "Monty Python" and "montypython"
  21.             # Please note that this code isn't going to be tested very well, if at all, because of my limited
  22.             # testing setup. But in my quickie tests it appears to be working right
  23.             if origtag = Tag.find(:first, :conditions => [%{name = ? AND id != ?}, tag.name, tag.id])
  24.               tag.articles.each do |article|
  25.                 # replace our tag with origtag in article.tags
  26.                 article.tags = article.tags.collect { |x| x.id == tag.id ? origtag : x }
  27.               end
  28.               tag.destroy
  29.             else
  30.               # ok, original tag
  31.               tag.save!
  32.             end
  33.           else
  34.             tag.save!
  35.           end
  36.         end
  37.       end
  38.     end
  39.   end
  40.   def self.down
  41.     STDERR.puts 'Removing display name from tags'
  42.     unless $schema_generator
  43.       Tag.update_all('name = display_name')
  44.     end
  45.     remove_column :tags, :display_name
  46.   end
  47. end