toptal/database_validations

View on GitHub
lib/database_validations/lib/checkers/db_presence_validator.rb

Summary

Maintainability
A
35 mins
Test Coverage
module DatabaseValidations
  module Checkers
    class DbPresenceValidator
      attr_reader :validator

      # @param [DatabaseValidations::DbPresenceValidator]
      def self.validate!(validator)
        new(validator).validate!
      end

      # @param [DatabaseValidations::DbPresenceValidator]
      def initialize(validator)
        @validator = validator
      end

      def validate!
        return if ENV['SKIP_DB_UNIQUENESS_VALIDATOR_INDEX_CHECK']

        validate_foreign_keys! unless validator.klass.abstract_class?
      end

      private

      def validate_foreign_keys!(adapter = Adapters::BaseAdapter.new(validator.klass))
        validator.attributes.each do |attribute|
          reflection = validator.klass._reflect_on_association(attribute)

          next unless reflection
          next if adapter.find_foreign_key_by_column(reflection.foreign_key)

          raise Errors::ForeignKeyNotFound.new(reflection.foreign_key, adapter.foreign_keys)
        end
      end
    end
  end
end