在Rails中重命名列

9

是否可以使用类似以下命令来重命名列:

script/generate migration AddColumnToTable column:type

? Thanks.


2
可能是重复的问题:如何使用迁移在Rails中重命名数据库列? - CharlesB
3个回答

17

Rails的ActiveRecord ConnectionAdapter提供了一个名为rename_column的迁移命令。您可以生成一个迁移,然后自己编写代码。示例(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;

注意:此操作仅会重命名该列,而不会更改其他表中对其的引用。


哇,这真的很有效,而且还可以与SQLite一起使用。我总是遇到这个问题,因为我喜欢在Rails中使用保留的列名,直到现在我一直使用更复杂的方法。 - Zane

2

非常好的问题。不幸的是,答案是否定的。请查看Rails 2.3.5源代码:

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

迁移生成器只能识别 addremoveto/from 这几个关键字。

2

我在这里使用了一点诡计。假设我想要将列 foo 改为 bar。

创建一个迁移,其中包括以下步骤:

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

这种方法非常脆弱。如果有任何一个步骤失败,你可能会丢失数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接