staugaard-magic_cache_keys 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION.yml +1 -1
- data/lib/magic_cache_keys.rb +12 -4
- data/test/magic_cache_keys_test.rb +8 -0
- metadata +1 -1
data/VERSION.yml
CHANGED
data/lib/magic_cache_keys.rb
CHANGED
@@ -26,11 +26,19 @@ module ActiveRecord
|
|
26
26
|
|
27
27
|
class << self
|
28
28
|
def cache_key(options = {})
|
29
|
-
order = options.delete(:order) || scope(:find, :order)
|
30
|
-
opts = {:select => "MD5(CONCAT(GROUP_CONCAT(CONV(#{quoted_table_name}.#{connection.quote_column_name(primary_key)},10,36)#{ ' ORDER BY ' + order unless order.blank?}), MAX(#{table_name}.updated_at))) as cached_key"}.reverse_merge(options)
|
31
|
-
|
32
29
|
connection.execute('SET group_concat_max_len = 1048576')
|
33
|
-
|
30
|
+
if options[:conditions] && options[:conditions].is_a?(String) && options[:conditions].strip.upcase.starts_with?('SELECT')
|
31
|
+
hash_sql = options[:conditions].sub(/SELECT (\/\*.*?\*\/ )?(.*)\bFROM\b/im) { "SELECT #{cache_key_select} FROM" }
|
32
|
+
else
|
33
|
+
options[:select] = cache_key_select(options.delete(:order) || scope(:find, :order))
|
34
|
+
hash_sql = construct_finder_sql(options)
|
35
|
+
end
|
36
|
+
|
37
|
+
"#{model_name.cache_key}/#{connection.select_value(hash_sql) || 'empty'}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def cache_key_select(order = nil)
|
41
|
+
"MD5(CONCAT(GROUP_CONCAT(CONV(#{quoted_table_name}.#{connection.quote_column_name(primary_key)},10,36)#{ ' ORDER BY ' + order unless order.blank?}), MAX(#{quoted_table_name}.#{connection.quote_column_name('updated_at')}))) as cached_key"
|
34
42
|
end
|
35
43
|
|
36
44
|
def has_many_with_cache_key(association_id, options = {}, &extension)
|
@@ -16,6 +16,7 @@ class Blog < ActiveRecord::Base
|
|
16
16
|
has_many :posts_orderd1, :class_name => 'Post', :order => 'title DESC'
|
17
17
|
has_many :posts_orderd2, :class_name => 'Post', :order => 'title ASC'
|
18
18
|
has_many :posts_conditioned, :class_name => 'Post', :conditions => {:title => 'This post has a few comments'}
|
19
|
+
has_many :posts_by_sql, :class_name => "Post", :finder_sql => 'SELECT * FROM posts WHERE blog_id = #{id}'
|
19
20
|
end
|
20
21
|
|
21
22
|
class MagicCacheKeysTest < ActiveSupport::TestCase
|
@@ -112,4 +113,11 @@ class MagicCacheKeysTest < ActiveSupport::TestCase
|
|
112
113
|
key2 = blogs(:a_blog).cache_key(:posts, :posts_orderd1)
|
113
114
|
assert_equal(key1, key2)
|
114
115
|
end
|
116
|
+
|
117
|
+
test "has_many associations with finder_sql generates a cache key" do
|
118
|
+
key1 = blogs(:a_blog).posts_by_sql.cache_key
|
119
|
+
assert_not_nil(key1)
|
120
|
+
key2 = blogs(:a_blog).posts.cache_key
|
121
|
+
assert_equal(key1, key2)
|
122
|
+
end
|
115
123
|
end
|