Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix-cache-returns-nil #3213

Merged
merged 1 commit into from May 25, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/lib/settings/extend.rb
Expand Up @@ -5,7 +5,7 @@ module Extend
extend ActiveSupport::Concern

def settings
ScopedSettings.for_thing(self)
@settings ||= ScopedSettings.new(self)
end
end
end
65 changes: 60 additions & 5 deletions app/lib/settings/scoped_settings.rb
@@ -1,14 +1,69 @@
# frozen_string_literal: true

module Settings
class ScopedSettings < ::Setting
def self.for_thing(object)
class ScopedSettings
def initialize(object)
@object = object
self
end

def self.thing_scoped
unscoped.where(thing_type: @object.class.base_class.to_s, thing_id: @object.id)
# rubocop:disable Style/MethodMissing
def method_missing(method, *args)
method_name = method.to_s
# set a value for a variable
if method_name[-1] == '='
var_name = method_name.sub('=', '')
value = args.first
self[var_name] = value
else
# retrieve a value
self[method_name]
end
end
# rubocop:enable Style/MethodMissing

def respond_to?(_method_name, _include_private = false)
true
end

def all_as_records
vars = thing_scoped
records = vars.map { |r| [r.var, r] }.to_h

Setting.send(:default_settings).each do |key, default_value|
next if records.key?(key) || default_value.is_a?(Hash)
records[key] = Setting.new(var: key, value: default_value)
end

records
end

def []=(key, value)
key = key.to_s
record = thing_scoped.find_by(var: key) || thing_scoped.new(var: key)
record.value = value
record.save!

Rails.cache.write(Setting.cache_key(key, @object), value)
value
end

def [](key)
Rails.cache.fetch(Setting.cache_key(key, @object)) do
db_val = thing_scoped.find_by(var: key.to_s)
if db_val
default_value = Setting.send(:default_settings)[key]
return default_value.with_indifferent_access.merge!(db_val.value) if default_value.is_a?(Hash)
db_val.value
else
Setting.send(:default_settings)[key]
end
end
end

protected

def thing_scoped
Setting.unscoped.where(thing_type: @object.class.base_class.to_s, thing_id: @object.id)
end
end
end
1 change: 0 additions & 1 deletion app/models/setting.rb
Expand Up @@ -35,7 +35,6 @@ def [](key)
default_settings[key]
end
end

val
end

Expand Down