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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...