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

jdo*_*dog 223 ruby mysql migration ruby-on-rails ruby-on-rails-3

对于我正在制作的应用,我需要将我的列类型从日期更改为日期时间.我不关心数据,因为它仍在开发中.

我怎样才能做到这一点?

apn*_*ing 504

首先在您的终端:

rails g migration change_date_format_in_my_table
Run Code Online (Sandbox Code Playgroud)

然后在您的迁移文件中:

对于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
Run Code Online (Sandbox Code Playgroud)

  • 你是对的,我只是假设初学者会选择最新的技术,但这当然是不确定的 (27认同)
  • 问题标记为"ruby-on-rails-3" (12认同)
  • 如果你想知道为什么没有使用单个`change`方法而不是`up`和`down`方法,那是因为[````方法不支持`change_column`迁移定义](http: //guides.rubyonrails.org/migrations.html#using-the-change-method). (10认同)
  • @Sucrenoir是的,这个标签是在他回答后通过apneadiving添加的. (2认同)
  • 这个答案只是部分正确,即使在rails 4上也不能使用change_column内部更改,否则向下迁移将无法正常工作.无论rails的版本如何,都应该使用up/down. (2认同)

Lee*_*lly 77

此外,如果您使用的是Rails 3或更新版本,则不必使用updown方法.你可以使用change:

class ChangeFormatInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :my_new_type
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 更改方法仅适用于可逆迁移.上面的代码会抛出一个ActiveRecord :: IrreversibleMigration异常.在更改方法中,只应使用http://api.rubyonrails.org/classes/ActiveRecord/Migration/CommandRecorder.html中的方法. (77认同)
  • 我正在运行Rails 4并且之前进行过这种迁移.改变不起作用!@ davekaro的评论是正确的. (3认同)
  • 对于Rails 5,这是正确且有效的解决方案. (3认同)
  • 当被颠倒时,它怎么知道它应该改变的旧列类型是什么? (3认同)

Tho*_*emm 41

在Rails 3.2和Rails 4中,Benjamin的流行答案的语法略有不同.

首先在您的终端:

$ rails g migration change_date_format_in_my_table
Run Code Online (Sandbox Code Playgroud)

然后在您的迁移文件中:

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
Run Code Online (Sandbox Code Playgroud)


Nik*_*bak 23

有一个change_column方法,只需在迁移时执行它,将datetime作为新类型.

change_column(:my_table, :my_column, :my_new_type)
Run Code Online (Sandbox Code Playgroud)