在ROR迁移期间将列类型从Date更改为DateTime


Answers:


508

首先在您的终端:

rails g migration change_date_format_in_my_table

然后在您的迁移文件中:

对于Rails> = 3.2:

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
    change_column :my_table, :my_column, :datetime
  end

  def down
    change_column :my_table, :my_column, :date
  end
end

27
没错,我只是假设一个初学者会选择可用的最新技术,但这当然不能肯定
2011年

12
该问题被标记为“ ruby​​-on-rails-3”
Sucrenoir

2
@Sucrenoir是的,他回答后通过呼吸暂停添加了标签。
杰森

10
如果您想知道为什么change不使用单个方法而不是upand down方法,那是因为change方法不支持change_column迁移定义
丹尼斯

2
这个答案仅部分正确,即使在第4条导轨上也不能使用change_column内部更改,否则向下迁移将无法进行。无论rails的版本如何,都应使用up / down。
艾伦·皮博迪

78

另外,如果您使用的是Rails 3或更高版本,则不必使用updown方法。您可以使用change

class ChangeFormatInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :my_new_type
  end
end

78
更改方法仅适用于可逆迁移。上面的代码将引发ActiveRecord :: IrreversibleMigration异常。更改方法仅应使用api.rubyonrails.org/classes/ActiveRecord/Migration/…中的方法。
davekaro

3
我正在运行Rails 4,并且以前进行过这种迁移。更改无效!@davekaro的评论是正确的。
哈里特2014年

3
对于Rails 5,这是正确且可行的解决方案。
WM

3
当反转时,它将如何知道应更改回原来的旧列类型?
Andrew Grimm

@AndrewGrimm你是正确的。这是我尝试撤消迁移时看到的:This migration uses change_column, which is not automatically reversible. To make the migration reversible you can either: 1. Define #up and #down methods in place of the #change method. 2. Use the #reversible method to define reversible behavior.
Marklar

42

在Rails 3.2和Rails 4中,本杰明的流行答案语法略有不同。

首先在您的终端:

$ rails g migration change_date_format_in_my_table

然后在您的迁移文件中:

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
   change_column :my_table, :my_column, :datetime
  end

  def down
   change_column :my_table, :my_column, :date
  end
end


1

AFAIK,进行模式更改时,可以通过迁移来重塑您关心的数据(即生产数据)。因此,除非那是错误的,并且因为他确实说过他不关心数据,所以为什么不修改从日期到日期时间的原始迁移中的列类型并重新运行迁移呢?(希望您有测试:)。


2
您可能会关心在开发环境中使用迁移,即使您不关心数据,如果您在团队中工作,并且希望将模式更改传播到团队中的所有其他开发人员。
Jose B

在这种情况下,我很难看到通过进行其他迁移来更改列有什么好处。更改创建该列的原始迁移有什么问题?在这两种情况下,每个团队成员都必须重新运行所有迁移以获取新架构。
fakeleft

如果使用新迁移,则只需撤消更改列类型的迁移即可。如果要编辑原始文件,则必须回滚该编辑文件,然后再重新运行迁移。
jazzpi

考虑到尚无生产数据,这实际上是一个非常谨慎的答案。对于那些担心其他团队成员的人,这就是rake db:migrate:reset目的。
Ryan McGeary '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.