【问题标题】:Is there a way to control column order in ActiveRecord migrations?有没有办法控制 ActiveRecord 迁移中的列顺序?
【发布时间】:2010-10-31 10:30:05
【问题描述】:

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

【问题讨论】:

  • 你为什么要这样做?
  • @klochner - 我无法回答 OP,但是当直接查看我的数据库时,我发现将相关列分组在一起很有用,我经常在开头引用的列所​​以我不必向右滚动,等等。

标签: ruby-on-rails ruby activerecord migration


【解决方案1】:

确实,这不是迁移 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 也是如此。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-13
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      相关资源
      最近更新 更多