-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
Copy pathstore.rb
89 lines (71 loc) · 1.91 KB
/
store.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# Use singleton class Spree::Preferences::Store.instance to access
#
require 'singleton'
module Spree::Preferences
class StoreInstance
def initialize
@cache = Rails.cache
end
def set(key, value)
@cache.write(key, value)
persist(key, value)
end
alias_method :[]=, :set
def exist?(key)
@cache.exist?(key) ||
should_persist? && Spree::Preference.where(key: key).exists?
end
def get(key)
# return the retrieved value, if it's in the cache
# use unless nil? incase the value is actually boolean false
#
unless (val = @cache.read(key)).nil?
return val
end
if should_persist?
# If it's not in the cache, maybe it's in the database, but
# has been cleared from the cache
# does it exist in the database?
if preference = Spree::Preference.find_by(key: key)
# it does exist
val = preference.value
else
# use the fallback value
val = yield
end
# Cache either the value from the db or the fallback value.
# This avoids hitting the db with subsequent queries.
@cache.write(key, val)
return val
else
yield
end
end
alias_method :fetch, :get
def delete(key)
@cache.delete(key)
destroy(key)
end
def clear_cache
@cache.clear
end
private
def persist(cache_key, value)
return unless should_persist?
preference = Spree::Preference.where(key: cache_key).first_or_initialize
preference.value = value
preference.save
end
def destroy(cache_key)
return unless should_persist?
preference = Spree::Preference.find_by(key: cache_key)
preference.destroy if preference
end
def should_persist?
Spree::Preference.table_exists?
end
end
class Store < StoreInstance
include Singleton
end
end