【问题标题】:rename_column and change_column in one for by active record migrationrename_column 和 change_column 合二为一,用于通过活动记录迁移
【发布时间】:2014-06-15 06:32:39
【问题描述】:

我必须重命名表a 的一列并更改它的数据类型。我目前正在做以下事情:

class RenameIdFromA < ActiveRecord::Migration
  def change
    rename_column :a, :a_id, :id
    change_column :a, :id, :string, :limit => 50
  end
end

有没有办法一次性完成?像

    rename_and_change_column :a, :a_id, :id, :string, :limit => 50

因为,可以通过以下查询一次性在MySQL 中完成:

ALTER TABLE `a` CHANGE `a_id` `id` varchar(50) DEFAULT 0 NOT NULL

【问题讨论】:

  • 据我所知不是开箱即用的。但我看不出您当前的解决方案有任何问题。它比你建议的另一个更清楚。
  • 那个问题没有回答问题。 @aross:在表有太多数据并且此迁移将运行两个查询的情况下,这将有所帮助,这将花费两倍的时间,因为我们知道我们可以在一个查询中执行此操作。
  • 然后你可以使用execute 来运行SQL。如果您还想支持其他数据库,您可以使用ActiveRecord::Base.connection.adapter_name 检查您的数据库适配器,如果条件与您支持的数据库引擎不匹配,您可以使用rename_columnchange_column。 (我用示例创建了一个答案。)

标签: mysql ruby activerecord migration


【解决方案1】:

您可以使用execute 按原样运行 SQL,然后如果有人使用您支持的另一个数据库引擎,则回退到默认方法。

class RenameIdFromA < ActiveRecord::Migration
  def change
    if ActiveRecord::Base.connection.adapter_name =~ /mysql/i
      execute "ALTER TABLE `a` CHANGE `a_id` `id` varchar(50) DEFAULT 0 NOT NULL"
    else
      rename_column :a, :a_id, :id
      change_column :a, :id, :string, :limit => 50
    end
  end
end

【讨论】:

    猜你喜欢
    • 2015-10-06
    • 1970-01-01
    • 2010-11-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多