class ChangeOrderLeadTimeFromStringToInteger < ActiveRecord::Migration[6.0]
def up
Product.where(order_lead_time: '').update_all(order_lead_time: nil)
change_column :products, :order_lead_time, 'integer USING CAST(order_lead_time AS integer)'
change_column_null :products, :order_lead_time, true
end
def down
change_column :products, :order_lead_time, :string
change_column_null :products, :order_lead_time, true
end
end
4条答案
按热度按时间nwo49xxi1#
不要丢弃列,使用此列
从PostgreSQL得到的“提示”基本上告诉您,您需要确认您希望发生这种情况,以及应该如何转换数据。要确认更改,请在迁移中使用上面的块
gblwokeq2#
其他的答案都是正确的,但是您可以使用
:using
关键字更进一步:iqxoj9l93#
不要删除该列,这将清除数据。
不过你可以试试
并且如果
company_id
中的所有值都可以转换为integer
,则应该是好的。如果不是这种情况(即不是所有字符串都可以默认转换),那么你可以做两个步骤:1)创建一个新列,然后在转换后加载
company_id
。2)删除company_id,然后重命名新列。您应该小心使用这两种方法(第二种方法更是如此),如果可以的话,您可能应该首先在数据库的副本上执行此操作。
hujrc8aj4#
我需要处理一些空字符串值,所以在转换为整数之前,我先将它们转换为
nil
。