这是我的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