Sha256: f0397dc290520447d492f8843dbd6611e70611e07ad6e606d6031ee99ca36c50

Contents?: true

Size: 1.85 KB

Versions: 2

Compression:

Stored size: 1.85 KB

Contents

# Usage (within an Age Model)
# validates_with UniqueEdgeValidator, attributes: [:employee_role, :start_node, :end_node]
# validates_with UniqueEdgeValidator, attributes: [:start_id, :employee_role, :end_id]
#
module ApacheAge
  module Validators
    class UniqueEdgeValidator < ActiveModel::Validator
      def validate(record)
        allowed_keys = record.age_properties.keys
        attributes = options[:attributes] || []

        edge_attribs =
          attributes
          .map { |attr| [attr, record.send(attr)] }.to_h
          .symbolize_keys
          .slice(*allowed_keys)

        possible_end_keys = [:end_id, 'end_id', :end_node, 'end_node']
        end_query =
          if possible_end_keys.any? { |key| attributes.include?(key) }
            end_query = query_node(record.end_node)
            edge_attribs[:end_id] = end_query&.id
            end_query
          end

        possible_start_keys = [:start_id, 'start_id', :start_node, 'start_node']
        start_query =
          if possible_start_keys.any? { |key| attributes.include?(key) }
            start_query = query_node(record.start_node)
            edge_attribs[:start_id] = start_query&.id
            start_query
          end
        return if attributes.blank? && (end_query.blank? || start_query.blank?)

        query = record.class.find_by(edge_attribs.compact)
        return if query.blank? || (query.id == record.id)

        record.errors.add(:base, 'record not unique')
        record.errors.add(:end_node, 'node combination not unique')
        record.errors.add(:start_node, 'node combination not unique')
        attributes.each { record.errors.add(_1, 'prpoerty combination not unique') }
      end

      private

      def query_node(node)
        return nil if node.blank?

        node.persisted? ? node.class.find(node.id) : node.class.find_by(node.age_properties)
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rails_age-0.4.1 lib/apache_age/validators/unique_edge_validator.rb
rails_age-0.4.0 lib/apache_age/validators/unique_edge_validator.rb