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