2015-09-10 34 views
0

我最初由迁移如下数据太长柱 - 轨道4迁移取消

class Createfriends < ActiveRecord::Migration 
    def change 
    create_table :friends do |t| 
     t.string :FirstName 
     t.string :LastName 
     t.string :MiddleName 
     t.string :Gendre 
     t.string :Email 
     t.string :ImageUrl 
     t.string :Country 
     t.string :City 
     t.timestamps null: false 
    end 
    end 
end 

然后我需要改变的ImageUrl的类型,有人可以加载发送可能超过255个字符链路的路径所以我做了一次迁移如下

class ChangeImageUrlInWaiter < ActiveRecord::Migration 
    def up 
    change_column :friends, :ImageUrl , :text 
    end 

    def down 
    change_column :friends ,:ImageUrl , :string 
    end 
end 

现在,当我尝试使用回滚所有迁移

rake db:migrate VERSION=0 

这引发了我的错误

rake aborted! StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Data too long for column 'ImageUrl' at row 1: ALTER TABLE waiters CHANGE ImageUrl ImageUrl varchar(255) DEFAULT NULL

原因很清楚,没有出现在的ImageUrl数据是超过255个,现在的问题是如何克服这个问题,在保存数据或者即使有损失的一些数据

+0

一种方式是在更改它的类型之前更新ImageUrl列。 –

+0

@Зелёный你能解释一下,请 – ImranNaqvi

回答

3

如果您可以截断数据,那么只需发出UPDATE查询,然后再将模式更改回255字符。

不要使用ActiveRecord in migrations,很难得到它的权利,并可能给你带来不同类型的问题。所以,你需要这个:

def down 
    execute 'UPDATE friends SET ImageUrl = SUBSTR(ImageUrl, 1, 255)' 
    change_column :friends, :ImageUrl, :string 
    end