class SettingsOnRails::KeyTreeBuilder

Attributes

keys[RW]
parent[RW]

Public Class Methods

new(keys, target_obj, target_column_name, parent) click to toggle source

All keys must be symbols, and attributes are strings Thus we can differentiate settings(:key).attr and settings(:key, :attr)

# File lib/settings_on_rails/key_tree_builder.rb, line 7
def initialize(keys, target_obj, target_column_name, parent)
  keys.each do |key_name|
    unless (key_name.is_a?(Symbol) || key_name.is_a?(String))
      raise ArgumentError.new("has_settings: symbol or string expected, but got a #{key_name.class}")
    end
  end
  @keys = keys
  @target_obj = target_obj
  @column_name = target_column_name
  @parent = parent
end

Public Instance Methods

build_nodes() click to toggle source

Call this method before set any values

# File lib/settings_on_rails/key_tree_builder.rb, line 27
def build_nodes
  value = _target_column

  for key in _key_chain
    value[key] = {} unless value[key]
    value = value[key]
  end
end
current_node() click to toggle source

Returns column[key_chain][key_chain][…]

# File lib/settings_on_rails/key_tree_builder.rb, line 20
def current_node
  return nil unless _key_node_exist?

  _key_chain.inject(_target_column) { |h, key| h[key] }
end

Private Instance Methods

_key_chain() click to toggle source

Returns a key chain which includes all parent's keys and self keys

# File lib/settings_on_rails/key_tree_builder.rb, line 50
def _key_chain
  handler = self
  key_chain = []

  begin
    key_chain = handler.keys + key_chain
    handler = handler.parent
  end while handler

  key_chain
end
_key_node_exist?() click to toggle source
# File lib/settings_on_rails/key_tree_builder.rb, line 38
def _key_node_exist?
  value = _target_column

  for key in _key_chain
    value = value[key]
    return false unless value
  end

  true
end
_target_column() click to toggle source
# File lib/settings_on_rails/key_tree_builder.rb, line 62
def _target_column
  if @target_obj.respond_to?(:read_attribute)
    @target_obj.read_attribute(@column_name.to_sym)
  else
    @target_obj.send(@column_name.to_sym)
  end
end