2009-06-04 109 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。

相关问题