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