module ValidatesLengthsFromDatabase::InstanceMethods

Public Instance Methods

validate_lengths_from_database() click to toggle source
# File lib/validates_lengths_from_database/core.rb, line 48
def validate_lengths_from_database
  options = self.class.validate_lengths_from_database_options

  if options[:only]
    columns_to_validate = options[:only].map(&:to_s)
  else
    columns_to_validate = self.class.column_names.map(&:to_s)
    columns_to_validate -= options[:except].map(&:to_s) if options[:except]
  end

  columns_to_validate.each do |column|
    column_schema = self.class.columns.find {|c| c.name == column }

    next if column_schema.nil?
    next if column_schema.respond_to?(:array) && column_schema.array
    next unless [:string, :text, :decimal].include?(column_schema.type)

    case column_schema.type
    when :string
      if column_limit = options[:limit][column_schema.type] || column_schema.limit
        validate_length_by_characters(column, column_limit)
      end
    when :text
      if column_limit = options[:limit][column_schema.type] || column_schema.limit
        validate_length_by_bytesize(column, column_limit)
      end
    when :decimal
      if column_schema.precision && column_schema.scale
        validate_numericality_with_precision(column, column_schema)
      end
    end
  end
end

Private Instance Methods

validate_length_by_bytesize(column, column_limit) click to toggle source
# File lib/validates_lengths_from_database/core.rb, line 92
def validate_length_by_bytesize(column, column_limit)
  validator =
    if ActiveModel::Validations::LengthValidator::RESERVED_OPTIONS.include?(:tokenizer)
      ActiveModel::Validations::LengthValidator.new(
        :allow_blank => true,
        :attributes => [column],
        :maximum => column_limit,
        :tokenizer => ->(string) { string.bytes }
      )
    else
      BytesizeValidator.new(
        :allow_blank => true,
        :attributes => [column],
        :maximum => column_limit,
        :too_long => "is too long (maximum is %{count} bytes)"
      )
    end

  validator.validate(self)
end
validate_length_by_characters(column, column_limit) click to toggle source
# File lib/validates_lengths_from_database/core.rb, line 84
def validate_length_by_characters(column, column_limit)
  ActiveModel::Validations::LengthValidator.new(
    :allow_blank => true,
    :attributes => [column],
    :maximum => column_limit
  ).validate(self)
end
validate_numericality_with_precision(column, column_schema) click to toggle source
# File lib/validates_lengths_from_database/core.rb, line 113
def validate_numericality_with_precision(column, column_schema)
  max_val = (10 ** column_schema.precision)/(10 ** column_schema.scale)

  ActiveModel::Validations::NumericalityValidator.new(
    :allow_blank => true,
    :attributes => [column],
    :less_than => max_val
  ).validate(self)
end