我最初做了如下迁移
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
CHANGEImageUrl
ImageUrl
varchar(255) DEFAULT NULL
原因很明显,ImageUrl 中存在超过 255 的数据,现在的问题是如何解决保存数据或即使不得不丢失一些数据的问题
最佳答案
如果您可以截断数据,则只需在将模式更改回 255
字符之前发出 UPDATE
查询。
不要使用 ActiveRecord in migrations ,很难做到正确,并且可能会给您带来不同类型的问题。所以,你需要这个:
def down
execute 'UPDATE friends SET ImageUrl = SUBSTR(ImageUrl, 1, 255)'
change_column :friends, :ImageUrl, :string
end
关于mysql - 列数据太长 - Rails 4 迁移已取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32501808/