我想使用迁移向表中添加一列。有没有办法将它添加到特定位置,而不是最后一列?我可以在API文档中找到任何“订单”选项。
答案 0 :(得分:3)
事实上,这不是迁移API的一部分,但如果您愿意放弃供应商中立性(并且您的数据库支持它),那么实施起来可能很容易。
如果您正在使用MySQL,这里是MysqlAdapter的猴子补丁,它将添加选项:after和:first to 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。
答案 1 :(得分:2)
我不相信“本地”迁移可以做到这一点。原因是许多数据库不支持在任意位置添加列。使用不支持它的数据库进行此操作所需的箍是非常重要的。
如果您的数据库支持它并且您不希望支持多个数据库,那么您可以直接在迁移中使用执行语句。