提问



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


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


我想将datetime中的列更改为date

最佳参考


我认为这应该有效。


change_column :table_name, :column_name, :date

其它参考1


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


例:


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


有关更多详细信息,请参阅Table类的API文档。[21]

其它参考2


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


如果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

其它参考3


正如我在前面的答案中发现的那样,需要三个步骤来更改列的类型:


步骤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测试了这个解决方案,它运行良好。

其它参考4


只需生成迁移:


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

其它参考5


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


步骤1:
  您需要使用迁移删除故障数据类型字段名称


例如:


rails g migration RemoveFieldNameFromTableName field_name:data_type


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


第2步:
  现在,您可以添加具有正确数据类型的字段


例如:


rails g migration AddFieldNameToTableName field_name:data_type


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

其它参考6


使用Rails 5



来自Rails指南:[22]



  如果您希望迁移执行Active Record不知道如何撤消的操作,可以使用reversible:[23]



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