在Rails中重命名列

时间:2010-02-16 22:51:06

标签: ruby-on-rails

是否可以使用如下命令重命名列:

script/generate migration AddColumnToTable column:type

?感谢。

3 个答案:

答案 0 :(得分:17)

Rails在名为rename_column的ActiveRecord ConnectionAdapter上有一个迁移命令。您可以生成迁移,然后自己编写代码。例子(MySQL):

script/generate migration rename_my_column_by_hand

然后编辑它创建的文件:

class RenameMyColumnByHand < ActiveRecord::Migration
  def self.up
    rename_column :my_table, :old_name, :new_name
  end

  def self.down
    rename_column :my_table, :new_name, :old_name
  end
end

它执行SQL,如:

ALTER TABLE my_table CHANGE old_name new_name BIGINT;

注意这只会重命名该列,它不会重命名您在其他表上使用的任何引用。

答案 1 :(得分:2)

好问题。不幸的是,答案是否定的。请参阅Rails 2.3.5源代码:

lib/rails_generator/generators/components/migration/migration_generator.rb

迁移生成器识别的唯一关键字是addremoveto / from

答案 2 :(得分:1)

我在这里使用了一些技巧。假设我想将列foo更改为bar。

使用以下步骤创建迁移

  • 添加临时列temp_foo
  • 更新所有记录,在temp_foo中保存foo的值
  • 添加栏栏
  • 更新所有记录,将栏中的temp_foo值保存为
  • 删除列foo
  • 删除列temp_foo

这非常脆弱。如果一步失败,您可能会丢失数据..