2014-04-29 43 views
0

我必須重命名錶a列的一列並更改它的數據類型。我目前正在做如下:rename_column and change_column in one for active record migration

class RenameIdFromA < ActiveRecord::Migration 
    def change 
    rename_column :a, :a_id, :id 
    change_column :a, :id, :string, :limit => 50 
    end 
end 

有沒有一種方法可以一氣呵成?像

rename_and_change_column :a, :a_id, :id, :string, :limit => 50 

如,它可以在MySQL做到一氣呵成,由以下查詢:

ALTER TABLE `a` CHANGE `a_id` `id` varchar(50) DEFAULT 0 NOT NULL 
+2

不是開箱即用,因爲我知道。但是我不能對目前的解決方案有任何疑問。那麼你建議的另一個更清楚。 – aross

+0

可能的重複[如何重命名列並通過同一時間更改其類型](http://stackoverflow.com/questions/13470670/how-to-rename-a-column-and-change-its-type-按同一時間遷移) –

+0

該問題未回答該問題。 @aross:這將有助於表格中數據太多的情況,並且此遷移將運行兩個查詢,這將花費兩倍的時間,因爲我們知道我們可以在一個查詢中自行完成此操作。 – Saurabh

回答

1

您可以運行SQL作爲與execute,然後退回到默認的方法,如果有人使用另一個數據庫引擎則是您支持的那個。

class RenameIdFromA < ActiveRecord::Migration 
    def change 
    if ActiveRecord::Base.connection.adapter_name =~ /mysql/i 
     execute "ALTER TABLE `a` CHANGE `a_id` `id` varchar(50) DEFAULT 0 NOT NULL" 
    else 
     rename_column :a, :a_id, :id 
     change_column :a, :id, :string, :limit => 50 
    end 
    end 
end 
相關問題