class ActiveRecord::Validations::DatabaseConstraintsValidator
Constants
- SIZE_VALIDATORS_FOR_TYPE
- VALID_CONSTRAINTS
Attributes
Public Class Methods
Source
# File lib/active_record/validations/database_constraints.rb, line 19 def initialize(options = {}) @constraints = Set.new(Array.wrap(options[:in]) + Array.wrap(options[:with])) @constraint_validators = {} super end
Calls superclass method
Public Instance Methods
Source
# File lib/active_record/validations/database_constraints.rb, line 62 def attribute_validators(klass, attribute) @constraint_validators[attribute] ||= begin column_definition = klass.columns_hash[attribute.to_s] unless column_definition raise ArgumentError.new("Model #{klass.name} does not have column #{attribute.to_s}!") end column = ActiveRecord::Validations::TypedColumn.new(column_definition) [ not_null_validator(klass, column), size_validator(klass, column), range_validator(klass, column), ].compact end end
Source
# File lib/active_record/validations/database_constraints.rb, line 25 def check_validity! invalid_constraints = constraints - VALID_CONSTRAINTS raise ArgumentError, "You have to specify what constraints to validate for." if constraints.empty? raise ArgumentError, "#{invalid_constraints.map(&:inspect).join(',')} is not a valid constraint." unless invalid_constraints.empty? end
Source
# File lib/active_record/validations/database_constraints.rb, line 32 def not_null_validator(klass, column) return unless constraints.include?(:not_null) return if column.null ActiveModel::Validations::NotNullValidator.new(attributes: [column.name.to_sym], class: klass) end
Source
# File lib/active_record/validations/database_constraints.rb, line 52 def range_validator(klass, column) return unless constraints.include?(:range) return unless mysql_adapter?(klass.connection) return unless column.number? args = { attributes: [column.name.to_sym], class: klass, allow_nil: true } args.merge!(ActiveRecord::DatabaseValidations::MySQL.column_range(column)) ActiveModel::Validations::NumericalityValidator.new(args) end
Source
# File lib/active_record/validations/database_constraints.rb, line 39 def size_validator(klass, column) return unless constraints.include?(:size) return unless mysql_adapter?(klass.connection) return unless column.text? || column.binary? maximum, type, encoding = ActiveRecord::DatabaseValidations::MySQL.column_size_limit(column) validator_class = SIZE_VALIDATORS_FOR_TYPE[type] if validator_class && maximum validator_class.new(attributes: [column.name.to_sym], class: klass, maximum: maximum, encoding: encoding) end end
Source
# File lib/active_record/validations/database_constraints.rb, line 80 def validate_each(record, attribute, _value) attribute_validators(record.class, attribute).each do |validator| validator.validate(record) end end