second_level_cache 2.1.0.rc1 → 2.1.0.rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md
CHANGED
@@ -134,10 +134,11 @@ end
|
|
134
134
|
|
135
135
|
```ruby
|
136
136
|
# this will fetch from cache
|
137
|
-
user = User.
|
137
|
+
user = User.fetch_by_uniq_keys(nick_name: "hooopo")
|
138
|
+
post = Post.fetch_by_uniq_keys(user_id: 2, slug: "foo")
|
138
139
|
|
139
140
|
# this also fetch from cache
|
140
|
-
user = User.
|
141
|
+
user = User.fetch_by_uniq_keys!(nick_name: "hooopo") # this will raise `ActiveRecord::RecordNotFound` Exception when nick name not exists.
|
141
142
|
```
|
142
143
|
|
143
144
|
* You can use Rails's [Eager Loading](http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations) feature as normal. Even better, second_level_cache will transform the `IN` query into a Rails.cache.multi_read operation. For example:
|
@@ -2,24 +2,38 @@
|
|
2
2
|
module SecondLevelCache
|
3
3
|
module ActiveRecord
|
4
4
|
module FetchByUniqKey
|
5
|
-
def
|
6
|
-
|
7
|
-
if _id = SecondLevelCache.cache_store.read(
|
5
|
+
def fetch_by_uniq_keys(where_values)
|
6
|
+
cache_key = cache_uniq_key(where_values)
|
7
|
+
if _id = SecondLevelCache.cache_store.read(cache_key)
|
8
8
|
self.find(_id) rescue nil
|
9
9
|
else
|
10
|
-
record = self.where(
|
11
|
-
record.tap{|record| SecondLevelCache.cache_store.write(
|
10
|
+
record = self.where(where_values).first
|
11
|
+
record.tap{|record| SecondLevelCache.cache_store.write(cache_key, record.id)} if record
|
12
12
|
end
|
13
13
|
end
|
14
|
+
|
15
|
+
def fetch_by_uniq_keys!(where_values)
|
16
|
+
fetch_by_uniq_keys(where_values) || raise(::ActiveRecord::RecordNotFound)
|
17
|
+
end
|
18
|
+
|
19
|
+
def fetch_by_uniq_key(value, uniq_key_name)
|
20
|
+
# puts "[Deprecated] will remove in the future, use fetch_by_uniq_keys method instead."
|
21
|
+
fetch_by_uniq_keys(uniq_key_name => value)
|
22
|
+
end
|
14
23
|
|
15
24
|
def fetch_by_uniq_key!(value, uniq_key_name)
|
25
|
+
# puts "[Deprecated] will remove in the future, use fetch_by_uniq_keys! method instead."
|
16
26
|
fetch_by_uniq_key(value, uniq_key_name) || raise(::ActiveRecord::RecordNotFound)
|
17
27
|
end
|
18
28
|
|
19
29
|
private
|
20
|
-
|
21
|
-
def cache_uniq_key(
|
22
|
-
|
30
|
+
|
31
|
+
def cache_uniq_key(where_values)
|
32
|
+
ext_key = where_values.collect { |k,v|
|
33
|
+
v = Digest::MD5.hexdigest(v) if v.size >= 32
|
34
|
+
[k,v].join("_")
|
35
|
+
}.join(",")
|
36
|
+
"uniq_key_#{self.name}_#{ext_key}"
|
23
37
|
end
|
24
38
|
end
|
25
39
|
end
|
data/second_level_cache.gemspec
CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |gem|
|
|
32
32
|
|
33
33
|
gem.add_runtime_dependency "activesupport", ["> 4.0.0", "< 5.0"]
|
34
34
|
|
35
|
-
gem.
|
35
|
+
gem.add_runtime_dependency "activerecord", ["> 4.0.0", "< 5.0"]
|
36
36
|
gem.add_development_dependency "sqlite3"
|
37
37
|
gem.add_development_dependency "rake"
|
38
38
|
gem.add_development_dependency "database_cleaner", "~> 1.2.0"
|
@@ -5,26 +5,43 @@ class ActiveRecord::FetchByUinqKeyTest < Minitest::Test
|
|
5
5
|
def setup
|
6
6
|
DatabaseCleaner[:active_record].start
|
7
7
|
@user = User.create :name => 'hooopo', :email => 'hoooopo@gmail.com'
|
8
|
+
@post = Post.create :slug => "foobar", :topic_id => 2
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_cache_uniq_key
|
12
|
+
assert_equal User.send(:cache_uniq_key, { :name => "hooopo" } ), "uniq_key_User_name_hooopo"
|
13
|
+
assert_equal User.send(:cache_uniq_key, { :foo => 1, :bar => 2 } ), "uniq_key_User_foo_1,bar_2"
|
14
|
+
long_val = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
15
|
+
assert_equal User.send(:cache_uniq_key, { :foo => 1, :bar => long_val } ), "uniq_key_User_foo_1,bar_#{Digest::MD5.hexdigest(long_val)}"
|
8
16
|
end
|
9
17
|
|
10
18
|
def test_should_query_from_db_using_primary_key
|
11
|
-
|
19
|
+
Post.fetch_by_uniq_keys(:topic_id => 2, :slug => "foobar")
|
12
20
|
$sql_logger = nil
|
13
|
-
|
14
|
-
assert_equal $sql_logger.strip, 'SELECT "
|
21
|
+
Post.fetch_by_uniq_keys(:topic_id => 2, :slug => "foobar")
|
22
|
+
assert_equal $sql_logger.strip, 'SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT 1'
|
15
23
|
end
|
16
24
|
|
17
25
|
def test_should_not_hit_db_using_fetch_by_uniq_key_twice
|
18
|
-
|
19
|
-
assert_equal
|
26
|
+
post = Post.fetch_by_uniq_keys(:topic_id => 2, :slug => "foobar")
|
27
|
+
assert_equal post, @post
|
20
28
|
no_connection do
|
21
|
-
|
29
|
+
Post.fetch_by_uniq_keys(:topic_id => 2, :slug => "foobar")
|
22
30
|
end
|
23
31
|
end
|
24
32
|
|
25
33
|
def test_should_fail_when_fetch_by_uniq_key_with_bang_method
|
26
34
|
assert_raises(ActiveRecord::RecordNotFound) do
|
27
|
-
|
35
|
+
Post.fetch_by_uniq_keys!(:topic_id => 2, :slug => "foobar1")
|
28
36
|
end
|
37
|
+
|
38
|
+
assert_raises(ActiveRecord::RecordNotFound) do
|
39
|
+
User.fetch_by_uniq_key!("xxxxx", :name)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_should_work_with_fetch_by_uniq_key
|
44
|
+
user = User.fetch_by_uniq_key(@user.name, :name)
|
45
|
+
assert_equal user, @user
|
29
46
|
end
|
30
47
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: second_level_cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.0.
|
4
|
+
version: 2.1.0.rc2
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-02-
|
12
|
+
date: 2014-02-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -44,7 +44,7 @@ dependencies:
|
|
44
44
|
- - <
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '5.0'
|
47
|
-
type: :
|
47
|
+
type: :runtime
|
48
48
|
prerelease: false
|
49
49
|
version_requirements: !ruby/object:Gem::Requirement
|
50
50
|
none: false
|