如何验证字符串属性避免" ActiveRecord :: StatementInvalid:Mysql2 ::错误:数据列太长[...]"例外?

时间:2016-02-08 14:41:29

标签: mysql ruby-on-rails ruby-on-rails-4

我遇到与包含UTF-8字符的字符串属性相关的MySQL文本列的问题。我们假设我们有这样的迁移:

class CreateItems < ActiveRecord::Migration
  def change
    create :items do |t|
      t.text "description", null: false
    end
  end
end

我们知道MySQL TEXT列的最大长度为65535字节,并且添加如下所示的验证可以防止此类MySQL例外:

class Item < ActiveRecord::Base
  validates :description, length: { maximum: 65535 }
end

当然,当用户放入一个包含超过1个字节长的字符的非常长的文本时,它就可以工作。有什么区别?参见示例:

> s = "A text with some national characters ĄąĘę"          
=> "A text with some national characters ĄąĘę"
> s.length
=> 41
> s.bytesize
=> 45

所以,例如如果有人用很多这样的字符写了65500个字符的长描述,验证通过它但MySQL不会原谅......

我暂时创建了bytesize验证:

class BytesizeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors.add(attribute, :too_long, count: options[:maximum]) if value.bytesize > options[:maximum]
  end
end

在模型中使用如下:

validates :description, bytesize: { maximum: 65535 }

解决了我的问题,但我相信,有一个简单的解决方案。也许我错过了一些东西,并且有可能按照预期在常规Rails length validation覆盖多字节字符?

我在Linux上使用Rails 4.2.5.1,Ruby 2.2.4和MariaDB 15.1。

0 个答案:

没有答案