ruby-on-rails – Rails 4迁移:Mysql2 ::错误:列’xxxx’的数据太长

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails 4迁移:Mysql2 ::错误:列’xxxx’的数据太长前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我的schema.rb
create_table "users",force: true do |t|
    t.string   "name",limit: 6
    t.string   "email"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

我为“name”列设置了字符串限制.

然后,在控制台中:

user = User.new(name:"1234567890",email:"username@gmail.com")
 user.save!

它引发了错误

ActiveRecord::StatementInvalid: MysqL2::Error: Data too long for column 'name' at row 1: INSERT INTO `users` (`created_at`,`email`,`name`,`updated_at`) VALUES ('2014-06-19 15:08:15','username@gmail.com','1234567890','2014-06-19 15:08:15')

但是,当我切换到rails 3时.

我发现它自动截断了字符串“1234567890”,并将“123456”插入数据库而没有错误.

在轨道4中有什么关于这个被删除了吗?

我应该自己在模型中添加一些截断函数吗?谢谢!

解决方法

您所看到的是MysqL的差异,而不是Rails.默认情况下,MysqL会截断太长的数据,而不是抛出错误.如果将MysqL设置为严格模式,它将抛出错误而不是静默截断数据.

默认情况下,版本4,Rails turns on strict mode.这就是为什么你看到Rails 3的不同行为.这是你可能想要的行为.静默截断数据几乎总是很糟糕,并且可能导致用户非常混乱的行为.

如果您确实要截断数据,可以使用turn off strict mode或使用之前的过滤器:

before_save :truncate_username
def truncate_username
  self.username = username.slice(0,6)
end

猜你在找的Ruby相关文章