Sha256: 5baa81ff04d24df8c5ee6266c3f6313376e98a0510a32677c1258e98b1673c1d
Contents?: true
Size: 1.83 KB
Versions: 1
Compression:
Stored size: 1.83 KB
Contents
module ActiveRecord module DatabaseValidations module StringTruncator extend ActiveSupport::Concern module ClassMethods def truncate_string(field) column = self.columns_hash[field.to_s] case column.type when :string lambda do return unless self.changes.key?(field.to_s) return if self[field].nil? limit = StringTruncator.mysql_textual_column_limit(column) value = self[field].to_s if limit && value.length > limit self[field] = value.slice(0, limit) end return true # to make sure the callback chain doesn't halt end when :text lambda do return unless self.changes.key?(field.to_s) return if self[field].nil? limit = StringTruncator.mysql_textual_column_limit(column) value = self[field].to_s value.encode!('utf-8') if value.encoding != Encoding::UTF_8 if limit && value.bytesize > limit self[field] = value.mb_chars.limit(limit).to_s end return true # to make sure the callback chain doesn't halt end end end end def self.mysql_textual_column_limit(column) @mysql_textual_column_limits ||= {} @mysql_textual_column_limits[column] ||= begin raise ArgumentError, "Only UTF-8 textual columns are supported." unless column.text? && column.collation =~ /\Autf8_/ column_type = column.sql_type.sub(/\(.*\z/, '').gsub(/\s/, '_').to_sym type_limit = ActiveRecord::Validations::DatabaseConstraintsValidator::TYPE_LIMITS.fetch(column_type, {}) column.limit || type_limit[:default_maximum] end end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
activerecord-databasevalidations-0.2.1 | lib/active_record/validations/string_truncator.rb |