Sha256: 3732c3d08bbf58c8b1771263180bfe8a620e2a5097ec9a91349ad60b782f94c8

Contents?: true

Size: 1.24 KB

Versions: 1

Compression:

Stored size: 1.24 KB

Contents

module ForeignKeyValidation

  class Validator

    attr_accessor :validate_against_key, :reflection_names, :object

    def initialize(opt={})
      self.validate_against_key = opt[:validate_against_key]
      self.reflection_names     = opt[:reflection_names] || []
      self.object               = opt[:object]
    end

    def validate
      to_enum(:invalid_reflection_names).map {|n| attach_error(n) }.any?
    end

    private

    def invalid_reflection_names(&block)
      reflection_names.each do |reflection_name|
        next unless keys_present?(reflection_name)
        if keys_different?(reflection_name)
          yield reflection_name
        end
      end
    end

    def key_on_relation(relation)
      object.public_send(relation).try(validate_against_key)
    end

    def key_on_object
      object.try(validate_against_key)
    end

    def keys_present?(relation)
      key_on_object.present? and key_on_relation(relation).present?
    end

    def keys_different?(relation)
      key_on_object != key_on_relation(relation)
    end

    def attach_error(reflection_name)
      object.errors.add(validate_against_key, ForeignKeyValidation.configuration.error_message.call(validate_against_key, reflection_name, object))
    end

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
foreign_key_validation-1.1.2 lib/foreign_key_validation/validator.rb