如何在Heroku中更改列类型?

我试图将db:migrations迁移到我的heorku实例中,但是我收到错误。 FAQ描述了我的错误如下:

无法更改列类型

示例:PGError:错误:列“verified_at”无法强制转换为键入“date”

原因:PostgreSQL不知道如何将该表中的所有行强制转换为指定的类型。 很可能这意味着您在该列中有一个整数或一个字符串。

解决方案:检查您的记录并确保它们可以转换为新类型。 有时,更容易避免使用change_column,而是重命名/创建新列。

如何立即更改此迁移。 这是我的问题。 对于我的Contacts表,我创建了以下内容:

t.string :date_entered 

在以后的迁移中,我执行以下操作:

  change_column :contacts, :date_entered, :date 

这个change_column似乎是个问题。

我应该……手动改变迁移吗? 有没有办法可以清理表格中的数据(我不知道Heroku会识别表格中的数据,因为我正在做耙子)。

我显然需要更改此值,并在整个应用程序中使用它。 谢谢。

这就是我想要的……想法?

 def self.up #change_column :contacts, :date_entered, :date #this fails in postgres, so trying the same outcome rename_column :contacts, :date_entered, :date_entered_old add_column :contacts, :date_entered, :date remove_column :contacts, :date_entered_old end def self.down add_column :contacts, :date_entered_old remove_column :contacts, :date_entered rename_column :contacts, :date_entered_old, :date_entered end 

请执行下列操作:

  1. 重命名列A.
  2. 将新列B创建为日期
  3. 将数据从A移动到B.
  4. 删除A.

换一种说法

 def self.up rename_column :contacts, :date_entered, :date_entered_string add_column :contacts, :date_entered, :date Contact.reset_column_information Contact.find_each { |c| c.update_attribute(:date_entered, c.date_entered_string) } remove_column :contacts, :date_entered_string end 

这是Simone Carletti解决方案的经过修改和测试的版本

 class ModifyContacts < ActiveRecord::Migration def self.up rename_column :contacts, :date_entered, :date_entered_string add_column :contacts, :date_entered, :date Contact.reset_column_information Contact.find(:all).each { |contact| contact.update_attribute(:date_entered, contact.date_entered_string) } remove_column :contacts, :date_entered_string end end