cache_column 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +1 -1
- data/Manifest +2 -0
- data/README.rdoc +49 -3
- data/Rakefile +1 -1
- data/cache_column.gemspec +3 -3
- data/generators/cache_column/cache_column_generator.rb +33 -0
- data/generators/cache_column/templates/cache_column_migration.rb.erb +13 -0
- data/init.rb +1 -1
- data/lib/cache_column.rb +12 -9
- metadata +6 -4
data/MIT-LICENSE
CHANGED
data/Manifest
CHANGED
data/README.rdoc
CHANGED
@@ -6,10 +6,56 @@ First add the following code to set-up the before_save filter and include the re
|
|
6
6
|
|
7
7
|
has_cached_columns
|
8
8
|
|
9
|
-
Next
|
9
|
+
Next, we need to set-up the columns that hold our cached values. This is accomplished through a migration
|
10
|
+
|
11
|
+
script/generate cache_column OBJECT/TABLENAME feild:type
|
12
|
+
|
13
|
+
For example
|
14
|
+
script/generate cache_column listing high_price:float low_price:float number_of_price_points:integer
|
15
|
+
|
16
|
+
The above migration will add cache columns of the defined time to the listings table.
|
17
|
+
|
18
|
+
Now we need to add our cache column deffinations to the model.
|
19
|
+
|
20
|
+
The general format is
|
10
21
|
cache_column :column_name, options
|
11
22
|
|
12
|
-
|
23
|
+
So for our example we want to add
|
24
|
+
cache_column :high_price
|
25
|
+
cache_column :low_price
|
26
|
+
cache_column :number_of_price_points
|
27
|
+
|
28
|
+
Now this dosn't do much so far other then map the virtual attribute
|
29
|
+
Object.high_price
|
30
|
+
to the database field
|
31
|
+
Ojbect.high_price_cache
|
32
|
+
|
33
|
+
No big deal, but the point is to store complex functions in the database. Lets say the high price attribute isn't so strait forward, and is calculated in the find_high_price function
|
34
|
+
|
35
|
+
def find_high_price
|
36
|
+
sleep(10)
|
37
|
+
return '10.05'
|
38
|
+
end
|
39
|
+
|
40
|
+
We can now tell the gem to update the cached value every time the object is saved by changing the cache_column deffination to
|
41
|
+
|
42
|
+
cache_column :high_price, :on_save => :recheck, :action => :find_high_price
|
43
|
+
|
44
|
+
Its fairly self explanitory, but this just tells the gem to recheck the price stored in high_price_cache when the model is saved (or touched). The stored value is retreived from the function named in the :action key
|
45
|
+
|
46
|
+
There are a few other options like
|
47
|
+
cache_column :high_price, :on_save => :blank
|
48
|
+
and
|
49
|
+
cache_column :high_price, :on_save => :recheck, :action => :find_high_price, :update_validation => :high_price_changed
|
50
|
+
|
51
|
+
The :on_save => :blank just clears the value when it gets saved... not sure what the point of that is yet.
|
52
|
+
|
53
|
+
:update_validation should be set to the name of a function, if that function returns false then the cache column will not be updated.
|
54
|
+
|
55
|
+
I would love feedback, and bugs reports.
|
13
56
|
|
57
|
+
== Limitations / Bugs
|
58
|
+
*Its my first gem.... so sorry for everything I've done wrong :)
|
59
|
+
*It dosn't store variables yet... Mabey next version. Till then use sanitize
|
14
60
|
|
15
|
-
Copyright (c) 2010
|
61
|
+
Copyright (c) 2010 Brian Malinconico, released under the MIT license
|
data/Rakefile
CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
require 'echoe'
|
4
4
|
|
5
|
-
Echoe.new('cache_column', '0.1.
|
5
|
+
Echoe.new('cache_column', '0.1.2') do |p|
|
6
6
|
p.description = "Utilize the database to cache complex operations."
|
7
7
|
p.url = "http://github.com/arjes/Cache-Column"
|
8
8
|
p.author = "Brian Malinconico"
|
data/cache_column.gemspec
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{cache_column}
|
5
|
-
s.version = "0.1.
|
5
|
+
s.version = "0.1.2"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Brian Malinconico"]
|
9
|
-
s.date = %q{2010-08-
|
9
|
+
s.date = %q{2010-08-21}
|
10
10
|
s.description = %q{Utilize the database to cache complex operations.}
|
11
11
|
s.email = %q{arjesins@gmail.com}
|
12
12
|
s.extra_rdoc_files = ["README.rdoc", "lib/cache_column.rb", "lib/tasks/cache_column.rake"]
|
13
|
-
s.files = ["MIT-LICENSE", "Manifest", "README.rdoc", "Rakefile", "init.rb", "install.rb", "lib/cache_column.rb", "lib/tasks/cache_column.rake", "test/cache_column_test.rb", "test/test_helper.rb", "uninstall.rb", "cache_column.gemspec"]
|
13
|
+
s.files = ["MIT-LICENSE", "Manifest", "README.rdoc", "Rakefile", "generators/cache_column/cache_column_generator.rb", "generators/cache_column/templates/cache_column_migration.rb.erb", "init.rb", "install.rb", "lib/cache_column.rb", "lib/tasks/cache_column.rake", "test/cache_column_test.rb", "test/test_helper.rb", "uninstall.rb", "cache_column.gemspec"]
|
14
14
|
s.homepage = %q{http://github.com/arjes/Cache-Column}
|
15
15
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Cache_column", "--main", "README.rdoc"]
|
16
16
|
s.require_paths = ["lib"]
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class CacheColumnGenerator < Rails::Generator::NamedBase
|
2
|
+
attr_accessor :cached_columns, :migration_name
|
3
|
+
|
4
|
+
def initialize(args, options = {})
|
5
|
+
super
|
6
|
+
@class_name = args[0]
|
7
|
+
@cached_columns = []
|
8
|
+
args[1..-1].each do |arg|
|
9
|
+
col_name, col_type = arg.split(':')
|
10
|
+
col_type ||= 'string'
|
11
|
+
@cached_columns.push({:name => col_name, :type => col_type})
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def manifest
|
16
|
+
file_name = generate_file_name
|
17
|
+
@migration_name = file_name.camelize
|
18
|
+
record do |m|
|
19
|
+
m.migration_template "cache_column_migration.rb.erb",
|
20
|
+
File.join('db', 'migrate'),
|
21
|
+
:migration_file_name => file_name
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def generate_file_name
|
28
|
+
names = @cached_columns.map{|a| a[:name].underscore }
|
29
|
+
names = names[0..-2] + ["and", names[-1]] if names.length > 1
|
30
|
+
"add_cache_column#{(names.length > 1) ? 's' : ''}_#{names.join("_")}_to_#{@class_name.underscore}"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class <%= migration_name %> < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
<% cached_columns.each do |attachment| -%>
|
4
|
+
add_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment[:name] %>_cache, :<%= attachment[:type] %>
|
5
|
+
<% end -%>
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.down
|
9
|
+
<% cached_columns.each do |attachment| -%>
|
10
|
+
remove_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment[:name] %>_cache
|
11
|
+
<% end -%>
|
12
|
+
end
|
13
|
+
end
|
data/init.rb
CHANGED
data/lib/cache_column.rb
CHANGED
@@ -30,6 +30,7 @@ module CacheColumn
|
|
30
30
|
|
31
31
|
cached_columns.each do |key,params|
|
32
32
|
next if params[:update_validation].present? and self.respond_to?(params[:update_validation]) and self.send("#{params[:update_validation]}") == false
|
33
|
+
next if params[:on_save].blank?
|
33
34
|
|
34
35
|
if params[:on_save] == :blank
|
35
36
|
new_value = ""
|
@@ -39,10 +40,10 @@ module CacheColumn
|
|
39
40
|
set = true
|
40
41
|
end
|
41
42
|
|
42
|
-
self
|
43
|
+
self["#{key}_cache".to_sym] = new_value if set == true
|
43
44
|
end
|
44
45
|
|
45
|
-
self.cache_updated_at = Time.now if self.respond_to?(:cached_updated_at)
|
46
|
+
#self.cache_updated_at = Time.now if self.respond_to?(:cached_updated_at)
|
46
47
|
end
|
47
48
|
|
48
49
|
|
@@ -58,15 +59,17 @@ module CacheColumn
|
|
58
59
|
end
|
59
60
|
|
60
61
|
def method_missing(method, *arguments, &block)
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
return self
|
62
|
+
cached_columns = self.class.instance_variable_get('@cached_columns')
|
63
|
+
|
64
|
+
if cached_columns.keys.include?(method) #then its a getter
|
65
|
+
return self["#{method}_cache".to_sym]
|
66
|
+
elsif method.to_s[-1,1] == '=' and cached_columns.keys.include?(method.to_s.chop.to_sym) and cached_columns[method.to_s.chop.to_sym][:action].blank? #then its a setter
|
67
|
+
return self["#{method.to_s.chop}_cache".to_sym] = arguments[0]
|
68
|
+
else
|
69
|
+
super
|
65
70
|
end
|
66
|
-
super
|
67
71
|
end
|
68
72
|
end
|
69
73
|
end
|
70
74
|
|
71
|
-
|
72
|
-
|
75
|
+
ActiveRecord::Base.send :include, CacheColumn
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cache_column
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 2
|
10
|
+
version: 0.1.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Brian Malinconico
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-08-
|
18
|
+
date: 2010-08-21 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -34,6 +34,8 @@ files:
|
|
34
34
|
- Manifest
|
35
35
|
- README.rdoc
|
36
36
|
- Rakefile
|
37
|
+
- generators/cache_column/cache_column_generator.rb
|
38
|
+
- generators/cache_column/templates/cache_column_migration.rb.erb
|
37
39
|
- init.rb
|
38
40
|
- install.rb
|
39
41
|
- lib/cache_column.rb
|