2009-06-04 111 views

回答

2

我不認爲有可能通過「本地」遷移來完成此操作。原因是許多數據庫不支持在任意位置添加列。你需要通過不支持它的數據庫來做到這一點是不重要的。

如果您的數據庫確實支持它並且您不希望支持多個數據庫,那麼您可以直接在您的遷移中使用執行語句。

3

事實上,這不是migrations API的一部分,但如果您願意放棄供應商中立性(並且您的數據庫支持它),那麼實現它可能相當容易。

如果你使用的是MySQL,這是MysqlAdapter的一個monkey-patch,它會添加選項:after和:first到add_column和change_column。 (See here for the relevant MySQL ALTER TABLE syntax

ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do 
    def add_column_options!(sql, options) 
    super 
    if options[:after] 
     sql << " AFTER #{quote_column_name(options[:after])}" 
    elsif options[:first] 
     sql << " FIRST" 
    end 
    end 
end 

所以現在

a.add_column :foos, :bar, :string, :null => false, :limit => 20, :after => "baz" 

將執行

ALTER TABLE `foos` ADD `bar` varchar(20) NOT NULL AFTER `baz` 

a.add_column :foos, :bar, :string, :null => false, :limit => 20, :first => true 

將執行

ALTER TABLE `foos` ADD `bar` varchar(20) NOT NULL FIRST 

同樣對於change_column。

相關問題