class Hashematics::Category

A Category is an index of objects. It holds two things:

  1. list of top-level objects

  2. list of top-level objects cross-referenced by a parent.

Attributes

default_parent_id[R]
id_key[R]
include_blank[R]
lookup[R]
parent_key[R]

Public Class Methods

new(id_key:, include_blank: false, parent_key: nil) click to toggle source
# File lib/hashematics/category.rb, line 17
def initialize(id_key:, include_blank: false, parent_key: nil)
  raise ArgumentError, 'id_key is required' unless id_key

  @default_parent_id  = Id.default
  @id_key             = Key.get(id_key)
  @include_blank      = include_blank || false
  @lookup             = {}
  @parent_key         = Key.get(parent_key)

  freeze
end

Public Instance Methods

add(record) click to toggle source
# File lib/hashematics/category.rb, line 35
def add(record)
  return self if skip_record?(record)

  set(
    record.id(parent_key),
    record.id(id_key),
    record
  )
end
records(parent_record = nil) click to toggle source
# File lib/hashematics/category.rb, line 29
def records(parent_record = nil)
  parent_id = parent_record&.id(parent_key) || default_parent_id

  get(parent_id).values
end

Private Instance Methods

get(parent_id) click to toggle source
# File lib/hashematics/category.rb, line 57
def get(parent_id)
  lookup[parent_id] ||= {}
end
include_record?(record) click to toggle source
# File lib/hashematics/category.rb, line 53
def include_record?(record)
  include_blank || record.id?(id_key)
end
set(parent_id, id, record) click to toggle source
# File lib/hashematics/category.rb, line 61
def set(parent_id, id, record)
  get(parent_id)[id] = record

  self
end
skip_record?(record) click to toggle source
# File lib/hashematics/category.rb, line 49
def skip_record?(record)
  !include_record?(record)
end