Sha256: b0244ccde4edc0aad3bc99df5380fed57f2966b38c03a7346c988ccbb4a3b010

Contents?: true

Size: 1.88 KB

Versions: 1

Compression:

Stored size: 1.88 KB

Contents

# encoding: UTF-8
# frozen_string_literal: true

require 'active_support/concern'
require 'active_support/lazy_load_hooks'

module ValidateLimits
  module Extension
    extend ActiveSupport::Concern

    included do
      class_attribute :attributes_with_limit_validation, instance_accessor: false, instance_predicate: false
      class_eval { self.attributes_with_limit_validation = [] }
    end

    module ClassMethods
      def inherited(cls)
        super.tap { cls.validate_limits }
      end

      def validate_limits
        return if defined?(ActiveRecord::SchemaMigration) && self <= ActiveRecord::SchemaMigration
        return if abstract_class?
        return remove_instance_variable(:@table_name) unless table_name.in?(ActiveRecord::Base.connection.tables)

        columns_hash.values.each do |column|
          next if attributes_with_limit_validation.include?(column.name)

          case column.type
            when :string, :text
              self.attributes_with_limit_validation += [column.name]
              validate do
                value = send(column.name)
                value = value.to_s unless String === value
                errors.add(column.name, :too_long) if value.length > column.limit
              end

            when :integer
              next if column.name == primary_key

              self.attributes_with_limit_validation += [column.name]
              bits = column.limit * 8
              min  = -(2**(bits-1))
              max  = +(2**(bits-1))-1
              validates_numericality_of column.name, greater_than_or_equal_to: min,
                                                     less_than_or_equal_to:    max,
                                                     if:                       :"#{column.name}?"
          end
        end
      end
    end
  end
end

ActiveSupport.on_load(:active_record) { ActiveRecord::Base.include ValidateLimits::Extension }

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
validate-limits-1.0.5 lib/validate-limits.rb