2010-05-10 53 views
284

我们有script/generate migration add_fieldname_to_tablename fieldname:datatype用于将新列添加到模型的语法。Rails migration for change列

在同一行上,我们有脚本/生成用于更改列的数据类型吗?或者我应该直接将SQL写入我的vanilla迁移中?

我想将列从datetime更改为date

回答

478

我认为这应该工作。

change_column :table_name, :column_name, :date 
+0

我希望更多的脚本/生成迁移路线。 change_column在独立迁移中工作正常 – papdel 2010-05-10 12:10:02

+13

@b_ayan:就我所知,迁移名称中唯一的神奇单词是“add”和“remove”。 – 2010-05-10 22:57:35

+0

这里的排序轨道noob,但是...我明白答案,但不是对这个答案的意见。澄清赞赏:) – 2011-10-12 01:25:20

93

如果您在表格中有多列更改,也可以使用块。

实施例:

change_table :table_name do |t| 
    t.change :column_name, :column_type, {options} 
end 

更多细节参见API documentation on the Table class

80

我不知道您是否可以从命令行创建迁移来完成所有这些操作,但是您可以创建新迁移,然后编辑迁移以执行此操作。

如果tablename是您的表的名称,fieldname是您的字段的名称,并且您想从日期时间更改为日期,则可以编写迁移来执行此操作。

您可以创建一个新的迁移:

rails g migration change_data_type_for_fieldname 

然后编辑迁移到使用change_table:

class ChangeDataTypeForFieldname < ActiveRecord::Migration 
    def self.up 
    change_table :tablename do |t| 
     t.change :fieldname, :date 
    end 
    end 
    def self.down 
    change_table :tablename do |t| 
     t.change :fieldname, :datetime 
    end 
    end 
end 

然后运行迁移:

rake db:migrate 
23

当我发现以前的答案,需要三个步骤来改变一列的类型:

第1步:

使用此代码生成一个新的迁移文件:

rails g migration sample_name_change_column_type 

第2步:

转到/db/migrate文件夹,并编辑自己迁移文件。有两种不同的解决方案。

  1. def change 
        change_column(:table_name, :column_name, :new_type) 
    end 
    

2.

def up 
     change_column :table_name, :column_name, :new_type 
    end 

    def down 
     change_column :table_name, :column_name, :old_type 
    end 

第3步:

不要忘记做这个命令:

rake db:migrate 

我已经测试这个解决方案对于Rails 4,它运行良好。

+1

在步骤2中,第一个在运行rake db:rollback后会失败,我建议您检查第二个 – Feuda 2016-12-14 09:45:51

+0

是否有一个rails约定,它允许在生成迁移文件时无需执行任何操作即可完成所有操作,然后编辑它? – BKSpurgeon 2017-01-19 23:52:50

+0

@BKSpurgeon是的,请查看文档:http://edgeguides.rubyonrails.org/active_record_migrations.html – 2017-01-20 09:13:41

0

另一种方法使用迁移更改数据类型

第一步: 您需要使用迁移

前以移除故障数据类型字段名称:

rails g migration RemoveFieldNameFromTableName field_name:data_type 

这里不要忘记为你的字段

指定数据类型

第2步: 现在你可以用正确的数据类型添加字段

例如:

rails g migration AddFieldNameToTableName field_name:data_type 

就是这样,现在用正确的数据类型字段添加表格就会快乐红宝石编码!

1

只是产生迁移:

rails g migration change_column_to_new_from_table_name 

更新迁移这样的:

class ClassName < ActiveRecord::Migration 
    change_table :table_name do |t| 
     t.change :column_name, :data_type 
    end 
end 

最后

rake db:migrate