我们有script/generate migration add_fieldname_to_tablename fieldname:datatype语法,用于向模型添加新列。

在同一行中,是否有用于更改列的数据类型的脚本/generate ?或者我应该直接将SQL写入我的常规迁移中?

我想将一列从datetime改为date。


当前回答

如果在一个表中有多个列要更改,也可以使用块。

例子:

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

有关更多细节,请参阅关于Table类的API文档。

其他回答

只需生成迁移:

rails g migration change_column_to_new_from_table_name

像这样更新迁移:

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

最后

rake db:migrate

另一种改变数据类型的方法是使用迁移

步骤1: 您需要使用迁移删除错误的数据类型字段名

ex:

rails g migration RemoveFieldNameFromTableName field_name:data_type

这里不要忘记为字段指定数据类型

步骤2: 现在您可以使用正确的数据类型添加字段

ex:

rails g migration AddFieldNameToTableName field_name:data_type

就是这样,现在你的表将添加正确的数据类型字段,快乐的ruby编码!!

正如我从前面的答案中发现的,改变列的类型需要三个步骤:

步骤1:

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

rails g migration sample_name_change_column_type

步骤2:

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

def变化 Change_column (:table_name,:column_name,:new_type) 结束

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上测试了这个解决方案,效果很好。

在编辑默认值的情况下完成回答:

在你的rails控制台:

rails g migration MigrationName

在迁移中:

  def change
    change_column :tables, :field_name, :field_type, default: value
  end

将看起来像:

  def change
    change_column :members, :approved, :boolean, default: true
  end

Rails 5

来自Rails指南:

如果你希望一个迁移做一些活动记录不知道如何反转的事情,你可以使用可逆:

class ChangeTablenameFieldname < ActiveRecord::Migration[5.1]
  def change
    reversible do |dir|
      change_table :tablename do |t|
        dir.up   { t.change :fieldname, :date }
        dir.down { t.change :fieldname, :datetime }
      end
    end
  end
end