有没有办法控制ActiveRecord迁移中的列顺序?

时间:2009-06-04 18:25:48

标签: ruby-on-rails ruby activerecord migration

我想使用迁移向表中添加一列。有没有办法将它添加到特定位置,而不是最后一列?我可以在API文档中找到任何“订单”选项。

2 个答案:

答案 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)

我不相信“本地”迁移可以做到这一点。原因是许多数据库不支持在任意位置添加列。使用不支持它的数据库进行此操作所需的箍是非常重要的。

如果您的数据库支持它并且您不希望支持多个数据库,那么您可以直接在迁移中使用执行语句。

相关问题