From 5b6cbf566aa3b6f577e77be9c5868a4c81808efa Mon Sep 17 00:00:00 2001 From: Dan Rice Date: Thu, 4 Oct 2012 10:20:26 -0400 Subject: [PATCH] Don't sort todos when counting them Grouping isn't as lax in PostgreSQL as it is in MySQL or SQLite. All sort fields also need to be in the GROUP BY, or be aggregated. The order isn't relevant when counting, so simply don't order in that case. Fix #1336 --- app/controllers/application_controller.rb | 6 +++--- app/models/user.rb | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 38539b9b..6ef7d4d8 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -280,14 +280,14 @@ class ApplicationController < ActionController::Base def init_not_done_counts(parents = ['project','context']) parents.each do |parent| - eval("@#{parent}_not_done_counts ||= current_user.todos.active.group('#{parent}_id').count") - eval("@#{parent}_deferred_counts ||= current_user.todos.deferred.group('#{parent}_id').count") + eval("@#{parent}_not_done_counts ||= current_user.todos.active.count_by_group('#{parent}_id')") + eval("@#{parent}_deferred_counts ||= current_user.todos.deferred.count_by_group('#{parent}_id')") end end def init_project_hidden_todo_counts(parents = ['project','context']) parents.each do |parent| - eval("@#{parent}_project_hidden_todo_counts = @#{parent}_project_hidden_todo_counts || current_user.todos.count(:conditions => ['state = ? or state = ?', 'project_hidden', 'active'], :group => :#{parent}_id)") + eval("@#{parent}_project_hidden_todo_counts ||= current_user.todos.active_or_hidden.count_by_group('#{parent}_id')") end end diff --git a/app/models/user.rb b/app/models/user.rb index 0dd35660..26e44856 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -81,7 +81,11 @@ class User < ActiveRecord::Base end has_many :todos, :order => 'todos.completed_at DESC, todos.created_at DESC', - :dependent => :delete_all + :dependent => :delete_all do + def count_by_group(g) + except(:order).group(g).count + end + end has_many :recurring_todos, :order => 'recurring_todos.completed_at DESC, recurring_todos.created_at DESC', :dependent => :delete_all