2010-02-16 62 views
9

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

script/generate migration AddColumnToTable column:type 

?谢谢。

+2

可能重复[如何在使用迁移的rails中重命名数据库列?](http://stackoverflow.com/questions/1992019/how-to-rename-a -database-column-in-rails-using-migration) – CharlesB 2012-05-30 05:37:37

回答

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; 

注意这仅重命名列,它赢得了”不要重新命名其他表上的任何引用。

+0

谢谢Scott,非常有用 – Victor 2010-02-17 08:07:19

+0

哇,这真的起作用,也用sqlite。我总是遇到这个问题,因为我喜欢使用在rails中保留的列名,直到现在我使用了更复杂的方法。 – Zane 2012-10-30 23:56:58

2

伟大的问题。不幸的是,答案是否定的。见的Rails 2.3.5源代码:

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

由迁移发生器识别的唯一关键字是addremove,和to/from

1

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

创建迁移下面的步骤

  • 添加一个临时列temp_foo
  • 更新的所有记录,在temp_foo
  • 节省Foo的价值添加条列
  • 更新的所有记录,保存temp_foo的value in bar
  • Drop column foo
  • Drop column temp_foo

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