public
Description: Tracks is a GTD(TM) web application, built with Ruby on Rails
Homepage: http://www.rousette.org.uk/projects/
Clone URL: git://github.com/bsag/tracks.git
Click here to lend your support to: tracks and make a donation at www.pledgie.com !
refactor conditional finds to use named_scopes

also use updated_at in calendar feed
lrbalt (author)
Sat Nov 29 06:35:17 -0800 2008
commit  9147fb887cfd94d6ad50de2a4300458a215a9405
tree    35d598d853147ce14416eeb7944589c6cfa05c19
parent  4a78b9f97a02b0247de6c2c05e4b0ce06631f7fc
...
134
135
136
137
138
 
 
139
140
141
...
134
135
136
 
 
137
138
139
140
141
0
@@ -134,8 +134,8 @@ class ContextsController < ApplicationController
0
   def render_contexts_mobile
0
     lambda do
0
       @page_title = "TRACKS::List Contexts"
0
-      @active_contexts = @contexts.find(:all, { :conditions => ["hide = ?", false]})
0
-      @hidden_contexts = @contexts.find(:all, { :conditions => ["hide = ?", true]})
0
+      @active_contexts = @contexts.active
0
+      @hidden_contexts = @contexts.hidden
0
       @down_count = @active_contexts.size + @hidden_contexts.size 
0
       cookies[:mobile_url]= {:value => request.request_uri, :secure => TRACKS_COOKIES_SECURE}
0
       render :action => 'index_mobile'
...
12
13
14
15
16
17
 
 
 
18
19
20
 
 
21
22
23
...
12
13
14
 
 
 
15
16
17
18
 
 
19
20
21
22
23
0
@@ -12,12 +12,12 @@ class FeedlistController < ApplicationController
0
       @contexts = current_user.contexts
0
     end
0
     
0
-    @active_projects = @projects.select{ |p| p.active? }
0
-    @hidden_projects = @projects.select{ |p| p.hidden? }
0
-    @completed_projects = @projects.select{ |p| p.completed? }
0
+    @active_projects = current_user.projects.active
0
+    @hidden_projects = current_user.projects.hidden
0
+    @completed_projects = current_user.projects.completed
0
     
0
-    @active_contexts = @contexts.select{ |c| !c.hidden? }
0
-    @hidden_contexts = @contexts.select{ |c| c.hidden? }
0
+    @active_contexts = current_user.contexts.active
0
+    @hidden_contexts = current_user.contexts.hidden
0
     
0
     respond_to do |format|
0
       format.html { render :layout => 'standard' }
...
31
32
33
34
 
35
36
37
...
83
84
85
86
 
87
88
89
...
124
125
126
127
128
129
 
 
 
130
131
132
...
161
162
163
164
165
166
 
 
 
167
168
169
...
199
200
201
202
203
204
 
 
 
205
206
207
...
211
212
213
214
215
216
 
 
 
217
218
219
...
31
32
33
 
34
35
36
37
...
83
84
85
 
86
87
88
89
...
124
125
126
 
 
 
127
128
129
130
131
132
...
161
162
163
 
 
 
164
165
166
167
168
169
...
199
200
201
 
 
 
202
203
204
205
206
207
...
211
212
213
 
 
 
214
215
216
217
218
219
0
@@ -31,7 +31,7 @@ class ProjectsController < ApplicationController
0
   end
0
 
0
   def projects_and_actions
0
-    @projects = @projects.select { |p| p.active? }
0
+    @projects = @projects.active
0
     respond_to do |format|
0
       format.text  { 
0
         render :action => 'index_text_projects_and_actions', :layout => false, :content_type => Mime::TEXT
0
@@ -83,7 +83,7 @@ class ProjectsController < ApplicationController
0
     @go_to_project = params['go_to_project']
0
     @saved = @project.save
0
     @project_not_done_counts = { @project.id => 0 }
0
-    @active_projects_count = current_user.projects.count(:conditions => "state = 'active'")
0
+    @active_projects_count = current_user.projects.active.count
0
     @contexts = current_user.contexts
0
     respond_to do |format|
0
       format.js { @down_count = current_user.projects.size }
0
@@ -124,9 +124,9 @@ class ProjectsController < ApplicationController
0
           @project_not_done_counts[@project.id] = @project.reload().not_done_todo_count(:include_project_hidden_todos => true)
0
         end
0
         @contexts = current_user.contexts
0
-        @active_projects_count = current_user.projects.count(:conditions => "state = 'active'")
0
-        @hidden_projects_count = current_user.projects.count(:conditions => "state = 'hidden'")
0
-        @completed_projects_count = current_user.projects.count(:conditions => "state = 'completed'")
0
+        @active_projects_count = current_user.projects.active.count
0
+        @hidden_projects_count = current_user.projects.hidden.count
0
+        @completed_projects_count = current_user.projects.completed.count
0
         render :template => 'projects/update.js.rjs'
0
         return
0
       elsif boolean_param('update_status')
0
@@ -161,9 +161,9 @@ class ProjectsController < ApplicationController
0
   
0
   def destroy
0
     @project.destroy
0
-    @active_projects_count = current_user.projects.count(:conditions => "state = 'active'")
0
-    @hidden_projects_count = current_user.projects.count(:conditions => "state = 'hidden'")
0
-    @completed_projects_count = current_user.projects.count(:conditions => "state = 'completed'")
0
+    @active_projects_count = current_user.projects.active.count
0
+    @hidden_projects_count = current_user.projects.hidden.count
0
+    @completed_projects_count = current_user.projects.completed.count
0
     respond_to do |format|
0
       format.js { @down_count = current_user.projects.size }
0
       format.xml { render :text => "Deleted project #{@project.name}" }
0
@@ -199,9 +199,9 @@ class ProjectsController < ApplicationController
0
     lambda do
0
       @page_title = "TRACKS::List Projects"
0
       @count = current_user.projects.size 
0
-      @active_projects = @projects.select{ |p| p.active? }
0
-      @hidden_projects = @projects.select{ |p| p.hidden? }
0
-      @completed_projects = @projects.select{ |p| p.completed? }
0
+      @active_projects = @projects.active
0
+      @hidden_projects = @projects.hidden
0
+      @completed_projects = @projects.completed
0
       @no_projects = @projects.empty?
0
       @projects.cache_note_counts
0
       @new_project = current_user.projects.build
0
@@ -211,9 +211,9 @@ class ProjectsController < ApplicationController
0
 
0
   def render_projects_mobile
0
     lambda do
0
-      @active_projects = @projects.select{ |p| p.active? }
0
-      @hidden_projects = @projects.select{ |p| p.hidden? }
0
-      @completed_projects = @projects.select{ |p| p.completed? }
0
+      @active_projects = @projects.active
0
+      @hidden_projects = @projects.hidden
0
+      @completed_projects = @projects.completed
0
       @down_count = @active_projects.size + @hidden_projects.size + @completed_projects.size 
0
       cookies[:mobile_url]= {:value => request.request_uri, :secure => TRACKS_COOKIES_SECURE}
0
       render :action => 'index_mobile'
...
118
119
120
121
 
122
123
124
...
140
141
142
143
 
144
145
146
...
118
119
120
 
121
122
123
124
...
140
141
142
 
143
144
145
146
0
@@ -118,7 +118,7 @@ class RecurringTodosController < ApplicationController
0
       else
0
         @message += " / did not create todo"
0
       end
0
-      @count = current_user.recurring_todos.count(:all, :conditions => ["state = ?", "active"])
0
+      @count = current_user.recurring_todos.active.count
0
     else
0
       @message = "Error saving recurring todo"
0
     end    
0
@@ -140,7 +140,7 @@ class RecurringTodosController < ApplicationController
0
     
0
     # delete the recurring todo
0
     @saved = @recurring_todo.destroy
0
-    @remaining = current_user.recurring_todos.count(:all)
0
+    @remaining = current_user.recurring_todos.count
0
     
0
     respond_to do |format|
0
       
...
8
9
10
11
 
12
13
14
...
8
9
10
 
11
12
13
14
0
@@ -8,7 +8,7 @@ class StatsController < ApplicationController
0
     @page_title = 'TRACKS::Statistics'
0
       
0
     @unique_tags = @tags.count(:all, {:group=>"tag_id"})
0
-    @hidden_contexts = @contexts.find(:all, {:conditions => ["hide = ? ", true]})
0
+    @hidden_contexts = @contexts.hidden
0
     @first_action = @actions.find(:first, :order => "created_at ASC")
0
     
0
     get_stats_actions
...
14
15
16
17
 
18
19
20
...
28
29
30
31
 
32
33
34
...
116
117
118
119
 
120
121
122
...
442
443
444
445
 
446
447
 
448
449
 
450
451
 
452
453
 
454
455
 
456
457
 
458
459
 
460
461
 
462
463
 
464
465
 
 
 
466
467
468
469
470
471
 
472
473
474
...
834
835
836
837
838
 
 
839
840
841
 
 
842
843
844
 
 
845
846
847
 
 
848
849
850
 
 
851
852
853
...
14
15
16
 
17
18
19
20
...
28
29
30
 
31
32
33
34
...
116
117
118
 
119
120
121
122
...
442
443
444
 
445
446
 
447
448
 
449
450
 
451
452
 
453
454
 
455
456
 
457
458
 
459
460
 
461
462
 
463
464
 
465
466
467
468
469
470
 
 
 
471
472
473
474
...
834
835
836
 
 
837
838
839
 
 
840
841
842
 
 
843
844
845
 
 
846
847
848
 
 
849
850
851
852
853
0
@@ -14,7 +14,7 @@ class TodosController < ApplicationController
0
     @projects = current_user.projects.find(:all, :include => [:default_context])
0
     @contexts = current_user.contexts.find(:all)
0
 
0
-    @contexts_to_show = @contexts.reject {|x| x.hide? }    
0
+    @contexts_to_show = current_user.contexts.active
0
     
0
     respond_to do |format|
0
       format.html  &render_todos_html
0
@@ -28,7 +28,7 @@ class TodosController < ApplicationController
0
   end
0
   
0
   def new
0
-    @projects = current_user.projects.select { |p| p.active? }
0
+    @projects = current_user.projects.active
0
     @contexts = current_user.contexts.find(:all)
0
     respond_to do |format|
0
       format.m {
0
@@ -116,7 +116,7 @@ class TodosController < ApplicationController
0
   def show
0
     respond_to do |format|
0
       format.m do
0
-        @projects = current_user.projects.select { |p| p.active? }
0
+        @projects = current_user.projects.active
0
         @contexts = current_user.contexts.find(:all)
0
         @edit_mobile = true
0
         @return_path=cookies[:mobile_url]
0
@@ -442,33 +442,33 @@ class TodosController < ApplicationController
0
     due_next_week_date = due_this_week_date + 7.days
0
     due_this_month_date = Time.zone.now.end_of_month
0
     
0
-    @due_today = current_user.todos.find(:all, 
0
+    @due_today = current_user.todos.not_completed.find(:all,
0
       :include => [:taggings, :tags], 
0
-      :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due <= ?', 'active', 'deferred', due_today_date],
0
+      :conditions => ['todos.due <= ?', due_today_date],
0
       :order => "due")
0
-    @due_this_week = current_user.todos.find(:all, 
0
+    @due_this_week = current_user.todos.not_completed.find(:all,
0
       :include => [:taggings, :tags], 
0
-      :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_today_date, due_this_week_date],
0
+      :conditions => ['todos.due > ? AND todos.due <= ?', due_today_date, due_this_week_date],
0
       :order => "due")
0
-    @due_next_week = current_user.todos.find(:all, 
0
+    @due_next_week = current_user.todos.not_completed.find(:all,
0
       :include => [:taggings, :tags], 
0
-      :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_this_week_date, due_next_week_date],
0
+      :conditions => ['todos.due > ? AND todos.due <= ?', due_this_week_date, due_next_week_date],
0
       :order => "due")
0
-    @due_this_month = current_user.todos.find(:all, 
0
+    @due_this_month = current_user.todos.not_completed.find(:all,
0
       :include => [:taggings, :tags], 
0
-      :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_next_week_date, due_this_month_date],
0
+      :conditions => ['todos.due > ? AND todos.due <= ?', due_next_week_date, due_this_month_date],
0
       :order => "due")
0
-    @due_after_this_month = current_user.todos.find(:all, 
0
+    @due_after_this_month = current_user.todos.not_completed.find(:all,
0
       :include => [:taggings, :tags], 
0
-      :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ?', 'active', 'deferred', due_this_month_date],
0
+      :conditions => ['todos.due > ?', due_this_month_date],
0
       :order => "due")
0
-    
0
+
0
+    @count = current_user.todos.not_completed.are_due.count
0
+
0
     respond_to do |format|
0
       format.html
0
       format.ics   {
0
-        @due_all = current_user.todos.find(:all, 
0
-          :conditions => ['(todos.state = ? OR todos.state = ?) AND NOT todos.due IS NULL', 'active', 'deferred'],
0
-          :order => "due")
0
+        @due_all = current_user.todos.not_completed.are_due.find(:all, :order => "due")
0
         render :action => 'calendar', :layout => false, :content_type => Mime::ICS
0
       }
0
     end
0
@@ -834,20 +834,20 @@ class TodosController < ApplicationController
0
     due_this_month_date = Time.zone.now.end_of_month
0
     case id
0
     when "due_today"
0
-      return 0 == current_user.todos.count(:all, 
0
-        :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due <= ?', 'active', 'deferred', due_today_date])
0
+      return 0 == current_user.todos.not_completed.count(:all,
0
+        :conditions => ['todos.due <= ?', due_today_date])
0
     when "due_this_week"
0
-      return 0 == current_user.todos.count(:all, 
0
-        :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_today_date, due_this_week_date])
0
+      return 0 == current_user.todos.not_completed.count(:all,
0
+        :conditions => ['todos.due > ? AND todos.due <= ?', due_today_date, due_this_week_date])
0
     when "due_next_week"
0
-      return 0 == current_user.todos.count(:all, 
0
-        :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_this_week_date, due_next_week_date])
0
+      return 0 == current_user.todos.not_completed.count(:all,
0
+        :conditions => ['todos.due > ? AND todos.due <= ?', due_this_week_date, due_next_week_date])
0
     when "due_this_month"
0
-      return 0 == current_user.todos.count(:all, 
0
-        :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_next_week_date, due_this_month_date])
0
+      return 0 == current_user.todos.not_completed.count(:all,
0
+        :conditions => ['todos.due > ? AND todos.due <= ?', due_next_week_date, due_this_month_date])
0
     when "due_after_this_month"      
0
-      return 0 == current_user.todos.count(:all, 
0
-        :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ?', 'active', 'deferred', due_this_month_date])
0
+      return 0 == current_user.todos.not_completed.count(:all,
0
+        :conditions => ['todos.due > ?', due_this_month_date])
0
     else
0
       raise Exception.new, "unknown due id for calendar: '#{id}'"      
0
     end
...
2
3
4
5
 
 
 
 
6
7
8
...
2
3
4
 
5
6
7
8
9
10
11
0
@@ -2,7 +2,10 @@ class Context < ActiveRecord::Base
0
 
0
   has_many :todos, :dependent => :delete_all, :include => :project, :order => "todos.completed_at DESC"
0
   belongs_to :user
0
-  
0
+
0
+  named_scope :active, :conditions => { :hide => false }
0
+  named_scope :hidden, :conditions => { :hide => true }
0
+
0
   acts_as_list :scope => :user
0
   extend NamePartFinder
0
   include Tracks::TodoList
...
3
4
5
 
 
 
 
6
7
8
...
3
4
5
6
7
8
9
10
11
12
0
@@ -3,6 +3,10 @@ class Project < ActiveRecord::Base
0
   has_many :notes, :dependent => :delete_all, :order => "created_at DESC"
0
   belongs_to :default_context, :class_name => "Context", :foreign_key => "default_context_id"
0
   belongs_to :user
0
+
0
+  named_scope :active, :conditions => { :state => 'active' }
0
+  named_scope :hidden, :conditions => { :state => 'hidden' }
0
+  named_scope :completed, :conditions => { :state => 'completed'}
0
   
0
   validates_presence_of :name, :message => "project must have a name"
0
   validates_length_of :name, :maximum => 255, :message => "project name must be less than 256 characters"
...
7
8
9
 
10
11
12
...
7
8
9
10
11
12
13
0
@@ -7,6 +7,7 @@ class Todo < ActiveRecord::Base
0
 
0
   named_scope :active, :conditions => { :state => 'active' }
0
   named_scope :not_completed, :conditions =>  ['NOT state = ? ', 'completed']
0
+  named_scope :are_due, :conditions => ['NOT todos.due IS NULL']
0
 
0
   STARRED_TAG_NAME = "starred"
0
   
...
20
21
22
23
 
24
25
26
...
20
21
22
 
23
24
25
26
0
@@ -20,7 +20,7 @@ CLASS:PUBLIC
0
 CATEGORIES:Tracks
0
 CREATED:<%= todo.created_at.strftime("%Y%m%dT%H%M%SZ") %>
0
 DESCRIPTION:<%= format_ical_notes(todo.notes) %>
0
-LAST-MODIFIED:<%= due_date.strftime("%Y%m%dT%H%M%SZ") %>
0
+LAST-MODIFIED:<%= updated_at.strftime("%Y%m%dT%H%M%SZ") %>
0
 LOCATION:
0
 SEQUENCE:0
0
 STATUS:CONFIRMED

Comments