Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #6999: preserve_options_rename_column_mysql.diff

File preserve_options_rename_column_mysql.diff, 3.2 kB (added by manfred, 2 years ago)
  • test/migration_test.rb

    old new  
    362362      end 
    363363    end 
    364364 
     365    if current_adapter?(:MysqlAdapter) 
     366      def test_rename_column_preserve_auto_increment 
     367        begin 
     368          ActiveRecord::Base.connection.create_table(:legacy) {} # We just need the id column 
     369          legacy = Class.new(ActiveRecord::Base) 
     370          legacy.send(:define_attr_method, :table_name, "legacy") 
     371          options = legacy.connection.select_one("SHOW COLUMNS FROM legacy LIKE 'id'") 
     372          assert_equal 'auto_increment', options['Extra']  
     373 
     374          legacy.connection.rename_column("legacy", "id", "orig_id") 
     375          options = legacy.connection.select_one("SHOW COLUMNS FROM legacy LIKE 'orig_id'") 
     376          assert_equal 'auto_increment', options['Extra']  
     377        ensure 
     378          ActiveRecord::Base.connection.drop_table :legacy rescue nil 
     379        end 
     380      end 
     381    end 
     382 
     383    def test_rename_column_preserve_default 
     384      begin 
     385        Person.connection.add_column "people", "contibutions", :integer, :default => 10, :null => false 
     386        Person.reset_column_information 
     387        columns = Person.connection.columns(:people) 
     388        column = columns.detect { |c| c.name == "contibutions" } 
     389        assert_equal 10, column.default 
     390        assert !column.null 
     391 
     392        Person.connection.rename_column("people", "contibutions", "contributions") 
     393        Person.reset_column_information 
     394        columns = Person.connection.columns(:people) 
     395        column = columns.detect { |c| c.name == "contributions" } 
     396        assert_equal 10, column.default 
     397        assert !column.null 
     398      ensure 
     399        Person.connection.remove_column("people", "contibutions") rescue ActiveRecord::StatementInvalid 
     400        Person.connection.remove_column("people", "contributions") rescue ActiveRecord::StatementInvalid 
     401      end 
     402    end 
     403 
    365404    def test_rename_table 
    366405      begin 
    367406        ActiveRecord::Base.connection.create_table :octopuses do |t| 
  • lib/active_record/connection_adapters/mysql_adapter.rb

    old new  
    380380      end 
    381381 
    382382      def rename_column(table_name, column_name, new_column_name) #:nodoc: 
    383         current_type = select_one("SHOW COLUMNS FROM #{table_name} LIKE '#{column_name}'")["Type"] 
    384         execute "ALTER TABLE #{table_name} CHANGE #{column_name} #{new_column_name} #{current_type}" 
     383        options = select_one("SHOW COLUMNS FROM #{table_name} LIKE '#{column_name}'") 
     384        rename_column_sql = "ALTER TABLE #{table_name} CHANGE #{column_name} #{new_column_name} #{options["Type"]}" 
     385        add_column_options!(rename_column_sql, :default => options["Default"], :null => (options["Null"] == "YES")) 
     386        rename_column_sql << ' ' << options['Extra'] unless options['Extra'].blank? 
     387        execute(rename_column_sql) 
    385388      end 
    386389 
    387  
    388390      private 
    389391        def connect 
    390392          encoding = @config[:encoding]