Class: SettingAccessors::SettingSet

Inherits:
Object
  • Object
show all
Includes:
Helpers
Defined in:
lib/setting_accessors/setting_set.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Helpers

#ensure_nested_hash!, #lookup_nested_hash

Constructor Details

#initialize(record) ⇒ SettingSet

Returns a new instance of SettingSet.



12
13
14
15
# File 'lib/setting_accessors/setting_set.rb', line 12

def initialize(record)
  @record = record
  @temp_settings = {}
end

Instance Attribute Details

#recordObject (readonly)

Returns the value of attribute record.



10
11
12
# File 'lib/setting_accessors/setting_set.rb', line 10

def record
  @record
end

Instance Method Details

#changed_settingsObject



112
113
114
# File 'lib/setting_accessors/setting_set.rb', line 112

def changed_settings
  @temp_settings.select { |k, _| value_changed?(k) }
end

#get(key, skip_cached: false) ⇒ Object Also known as: []

Tries to retrieve the given setting’s value from the temp settings (already read/written values in this instance). If the setting hasn’t been used before, its value is retrieved from the database.

If a setting hasn’t been read by this record (instance) before, its value is stored in the local read set.

TODO: See if this causes problems with read settings not being updated by external changes.

    User1: Read Setting X
    User2: Update Setting X
    User1: Read Setting X -> Gets old value from temp settings.
This shouldn't be too dangerous as the system state will be refreshed with every request though.

Parameters:

  • skip_cached (Boolean) (defaults to: false)

    If set to true, the setting value is freshly loaded from the database, even if a value that’s not yet persisted exists.



35
36
37
38
39
40
41
# File 'lib/setting_accessors/setting_set.rb', line 35

def get(key, skip_cached: false)
  return @temp_settings[key.to_sym] if !skip_cached && key?(key)

  value = SettingAccessors.setting_class.get(key, record)
  @temp_settings[key.to_sym] = value unless value.nil?
  value
end

#get_or_default(key, store_default: true, skip_cached: false) ⇒ Object

Tries to find a setting for this record. If none is found, will return the default setting value specified in the setting accessor call

Parameters:

  • store_default (Boolean) (defaults to: true)

    If set to true, the setting’s default value is written to the temporary settings for faster access. Otherwise, a database lookup is performed every time.

  • skip_cached (Boolean) (defaults to: false)

    If set to true, a possible temporary setting is skipped when looking up the value. This means, the default value is returned even if there is a not yet persisted change to the setting.



73
74
75
76
77
78
79
80
# File 'lib/setting_accessors/setting_set.rb', line 73

def get_or_default(key, store_default: true, skip_cached: false)
  result = get(key, skip_cached: skip_cached)
  return result if result || (key?(key) && !skip_cached)

  try_dup(SettingAccessors.setting_class.get_or_default(key, record)).tap do |value|
    set(key, value) if store_default
  end
end

#key?(key) ⇒ Boolean

Returns:

  • (Boolean)


45
46
47
# File 'lib/setting_accessors/setting_set.rb', line 45

def key?(key)
  @temp_settings.key?(key.to_sym)
end

#set(key, val) ⇒ Object Also known as: []=

Writes a setting’s value



52
53
54
55
56
# File 'lib/setting_accessors/setting_set.rb', line 52

def set(key, val)
  track_old_value(key)
  set_value_before_type_cast(key, val)
  @temp_settings[key.to_sym] = SettingAccessors::Internal.converter(value_type(key)).new(val).convert
end

#value_before_type_cast(key) ⇒ Object



106
107
108
109
110
# File 'lib/setting_accessors/setting_set.rb', line 106

def value_before_type_cast(key)
  lookup_nested_hash(@values_before_type_casts, key.to_s)
rescue NestedHashKeyNotFoundException
  get(key)
end

#value_changed?(key) ⇒ Boolean

Returns:

  • (Boolean)


102
103
104
# File 'lib/setting_accessors/setting_set.rb', line 102

def value_changed?(key)
  get(key) != value_was(key)
end

#value_type(key) ⇒ String

Returns the setting’s value type in the record‘s context.

Returns:

  • (String)

    the setting’s value type in the record‘s context



85
86
87
# File 'lib/setting_accessors/setting_set.rb', line 85

def value_type(key)
  SettingAccessors::Internal.setting_value_type(key, record)
end

#value_was(key) ⇒ Object

Returns the value the given setting had after it was last persisted.

Returns:

  • (Object)

    the value the given setting had after it was last persisted



96
97
98
99
100
# File 'lib/setting_accessors/setting_set.rb', line 96

def value_was(key)
  lookup_nested_hash(@old_values, key.to_s)
rescue NestedHashKeyNotFoundException
  get(key)
end