如何在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
请执行下列操作:
- 重命名列A.
- 将新列B创建为日期
- 将数据从A移动到B.
- 删除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