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

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

我想将一列从datetime改为date。


当前回答

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

如果tablename是表的名称,fieldname是字段的名称,并且您希望从一个datetime更改到另一个日期,您可以编写一个迁移来实现这一点。

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

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

其他回答

你可以使用change_column:

def change
  change_column :table_name, :column_name, :new_data_type
end

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

在你的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 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

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

例子:

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

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

使用# change_column。

change_column(:table_name, :column_name, :date)

# a few more examples:
change_column(:suppliers, :name, :string, limit: 80)
change_column(:accounts, :description, :text)

注意:即使在数据库迁移之外也可以得到相同的结果,这可能对测试/调试很方便,但这个方法需要非常谨慎地使用:

ActiveRecord::Base.connection.change_column(:table_name, :column_name, :date)