Add some caching for trace views.
authorTom Hughes <tom@compton.nu>
Sun, 10 Jan 2010 17:44:57 +0000 (17:44 +0000)
committerTom Hughes <tom@compton.nu>
Sun, 10 Jan 2010 17:44:57 +0000 (17:44 +0000)
app/controllers/trace_controller.rb
app/models/trace_sweeper.rb [new file with mode: 0644]
app/models/tracetag_sweeper.rb [new file with mode: 0644]

index 4c4ec60a7ab59401785ad98b812a439025c4ade0..9b32c32a7c3b6e87fdcc9229d0f97dea292768c5 100644 (file)
@@ -15,6 +15,11 @@ class TraceController < ApplicationController
   before_filter :offline_redirect, :only => [:create, :edit, :delete, :data, :api_data, :api_create]
   around_filter :api_call_handle_error, :only => [:api_details, :api_data, :api_create]
 
+  caches_action :list, :view, :layout => false
+  caches_action :georss, :layout => true
+  cache_sweeper :trace_sweeper, :only => [:create, :edit, :delete, :api_create]
+  cache_sweeper :tracetag_sweeper, :only => [:create, :edit, :delete, :api_create]
+
   # Counts and selects pages of GPX traces for various criteria (by user, tags, public etc.).
   #  target_user - if set, specifies the user to fetch traces for.  if not set will fetch all traces
   def list(target_user = nil, action = "list")
diff --git a/app/models/trace_sweeper.rb b/app/models/trace_sweeper.rb
new file mode 100644 (file)
index 0000000..52780f9
--- /dev/null
@@ -0,0 +1,28 @@
+class TraceSweeper < ActionController::Caching::Sweeper
+  observe Trace
+
+  def after_create(record)
+    expire_cache_for(record)
+  end
+
+  def after_update(record)
+    expire_cache_for(record)
+  end
+
+  def after_destroy(record)
+    expire_cache_for(record)
+  end
+
+private
+
+  def expire_cache_for(record)
+    expire_action(:controller => 'trace', :action => 'view', :id => record.id)
+    expire_action(:controller => 'trace', :action => 'view', :display_name => record.user.display_name, :id => record.id)
+
+    expire_action(:controller => 'trace', :action => 'list', :display_name => nil, :tag => nil)
+    expire_action(:controller => 'trace', :action => 'list', :display_name => record.user.display_name, :tag => nil)
+
+    expire_action(:controller => 'trace', :action => 'georss', :display_name => nil, :tag => nil)
+    expire_action(:controller => 'trace', :action => 'georss', :display_name => record.user.display_name, :tag => nil)
+  end
+end
diff --git a/app/models/tracetag_sweeper.rb b/app/models/tracetag_sweeper.rb
new file mode 100644 (file)
index 0000000..f9de1dd
--- /dev/null
@@ -0,0 +1,25 @@
+class TracetagSweeper < ActionController::Caching::Sweeper
+  observe Tracetag
+
+  def after_create(record)
+    expire_cache_for(record)
+  end
+
+  def after_update(record)
+    expire_cache_for(record)
+  end
+
+  def after_destroy(record)
+    expire_cache_for(record)
+  end
+
+private
+
+  def expire_cache_for(record)
+    expire_action(:controller => 'trace', :action => 'list', :display_name => nil, :tag => record.tag)
+    expire_action(:controller => 'trace', :action => 'list', :display_name => record.trace.user.display_name, :tag => record.tag)
+
+    expire_action(:controller => 'trace', :action => 'georss', :display_name => nil, :tag => record.tag)
+    expire_action(:controller => 'trace', :action => 'georss', :display_name => record.trace.user.display_name, :tag => record.tag)
+  end
+end