tzz*_*zoz 8 ruby-on-rails rails-migrations ruby-on-rails-4
这是我的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
Run Code Online (Sandbox Code Playgroud)
我为列"name"设置了字符串限制.
然后,在控制台中:
user = User.new(name:"1234567890",email:"username@gmail.com")
user.save!
Run Code Online (Sandbox Code Playgroud)
它引发了错误:
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')
Run Code Online (Sandbox Code Playgroud)
但是,当我切换到导轨3.
我发现它自动截断了字符串" 1234567890 ",并将" 123456 "插入数据库而没有错误.
有什么关于这个已被删除在rails 4?
我应该自己在模型中添加一些截断函数吗?谢谢!
Jam*_*son 17
您所看到的是MySQL的差异,而不是Rails.默认情况下,MySQL会截断太长的数据,而不是抛出错误.如果将MySQL设置为strict模式,它将抛出错误而不是静默截断数据.
对于版本4,Rails默认启用严格模式.这就是为什么你看到Rails 3的不同行为.这是你可能想要的行为.静默截断数据几乎总是很糟糕,并且可能导致用户非常混乱的行为.
如果您确实要截断数据,可以关闭严格模式或使用之前的过滤器:
before_save :truncate_username
def truncate_username
self.username = username.slice(0, 6)
end
Run Code Online (Sandbox Code Playgroud)
我偶然发现这篇文章恰好是几天前写的.
主要兴趣点是:
...我最近从rails 3.2升级到rails 4.0.他们使用ActiveRecords实现了一项重大更改,除了源和更改日志之外,我没有提到任何地方.
mysql默认mysql2设置和连接将SQL_MODE=STRICT_ALL_TABLES避免静默数据丢失.这可以通过strict: false在您的指定中 禁用database.yml.
这似乎可以解释为什么当你恢复到Rails 3时你停止接收错误的原因.你可以在MySQL连接适配器模块的选项中看到这一点,看起来它是在2012年5月为4.1.2添加的发布候选人(如果我正确阅读标签).
此人解决了他们的问题,通过... [修复]代码要么有正确的字段长度,或手动截断数据....
在您的情况下,您可以通过添加strict: false您的Rails 4来解决您在Rails 4 中的问题database.yml.如果你想自定义截断数据的方式,我同意JKen13579关于before_save回调的建议.否则,从我所看到的,它似乎截断最右边的字符,所以如果这是足够的,你可以逃脱默认的截断行为.
| 归档时间: |
|
| 查看次数: |
8387 次 |
| 最近记录: |