确实,这不是迁移 API 的一部分,但如果您愿意放弃供应商中立性(并且您的数据库支持它),它可能很容易实现。
如果您使用的是 MySQL,这里有一个针对 MysqlAdapter 的猴子补丁,它将向 add_column 和 change_column 添加选项 :after 和 :first。 (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 也是如此。