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