diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2012-07-24 17:39:30 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2012-07-24 17:39:30 +0000 |
commit | faab8678d440908a7190a1a4300fdfbca52efe47 (patch) | |
tree | bccc396a46494af77a2ba995242f349d92c10f23 /app/models/query.rb | |
parent | 44fcc8919d48a93f77bb0f671816c4c70811306e (diff) | |
download | redmine-faab8678d440908a7190a1a4300fdfbca52efe47.tar.gz redmine-faab8678d440908a7190a1a4300fdfbca52efe47.zip |
Ability to group and sort the issue list by user/version custom field (#9419).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10073 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/models/query.rb')
-rw-r--r-- | app/models/query.rb | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/app/models/query.rb b/app/models/query.rb index 5e76b17fe..2d9ab303c 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -604,13 +604,11 @@ class Query < ActiveRecord::Base def issues(options={}) order_option = [group_by_sort_order, options[:order]].reject {|s| s.blank?}.join(',') order_option = nil if order_option.blank? - - joins = (order_option && order_option.include?('authors')) ? "LEFT OUTER JOIN users authors ON authors.id = #{Issue.table_name}.author_id" : nil issues = Issue.visible.scoped(:conditions => options[:conditions]).find :all, :include => ([:status, :project] + (options[:include] || [])).uniq, :conditions => statement, :order => order_option, - :joins => joins, + :joins => joins_for_order_statement(order_option), :limit => options[:limit], :offset => options[:offset] @@ -626,13 +624,11 @@ class Query < ActiveRecord::Base def issue_ids(options={}) order_option = [group_by_sort_order, options[:order]].reject {|s| s.blank?}.join(',') order_option = nil if order_option.blank? - - joins = (order_option && order_option.include?('authors')) ? "LEFT OUTER JOIN users authors ON authors.id = #{Issue.table_name}.author_id" : nil Issue.visible.scoped(:conditions => options[:conditions]).scoped(:include => ([:status, :project] + (options[:include] || [])).uniq, :conditions => statement, :order => order_option, - :joins => joins, + :joins => joins_for_order_statement(order_option), :limit => options[:limit], :offset => options[:offset]).find_ids rescue ::ActiveRecord::StatementInvalid => e @@ -895,4 +891,24 @@ class Query < ActiveRecord::Base def relative_date_clause(table, field, days_from, days_to) date_clause(table, field, (days_from ? Date.today + days_from : nil), (days_to ? Date.today + days_to : nil)) end + + # Additional joins required for the given sort options + def joins_for_order_statement(order_options) + joins = [] + + if order_options + if order_options.include?('authors') + joins << "LEFT OUTER JOIN #{User.table_name} authors ON authors.id = #{Issue.table_name}.author_id" + end + order_options.scan(/cf_\d+/).uniq.each do |name| + column = available_columns.detect {|c| c.name.to_s == name} + join = column.custom_field.join_for_order_statement + if join + joins << join + end + end + end + + joins.any? ? joins.join(' ') : nil + end end |