Commit 366f4c42d7e2b4f3da15c6173971c68ae33bbe18

Authored by Francisco Marcelo de Araújo Lima Júnior
1 parent 39f927e5

#pairwise - add support for sorting choices

app/controllers/choices_controller.rb
... ... @@ -5,45 +5,93 @@ class ChoicesController < InheritedResources::Base
5 5 has_scope :active, :type => :boolean, :only => :index
6 6  
7 7 before_filter :authenticate
8   -
  8 +
9 9 def index
10   - order = 'score DESC'
11   - order = params[:order].map{|a| "#{a.first} #{a.second}"}.join(',') unless params[:order].blank?
  10 + if params[:limit]
  11 + @question = current_user.questions.find(params[:question_id])
12 12  
13   - conditions = []
14   - conditions << ['lower(data) like ?', params[:filter][:data].downcase] if params[:filter] && !params[:filter][:data].blank?
  13 + find_options = {:conditions => {:question_id => @question.id},
  14 + :limit => params[:limit].to_i,
  15 + :order => 'score DESC'
  16 + }
15 17  
16   - @question = current_user.questions.find(params[:question_id])
  18 + find_options[:conditions].merge!(:active => true) unless params[:include_inactive]
  19 +
  20 + find_options[:include] = [:creator]
  21 +
  22 + if(params[:ignore_flagged])
  23 + find_options[:include] << :flags
  24 + find_options[:conditions].merge!({:flags => {:id => nil}})
  25 + end
  26 +
  27 + find_options.merge!(:offset => params[:offset]) if params[:offset]
  28 +
  29 + @choices = Choice.find(:all, find_options)
  30 +
  31 + else
  32 + @question = current_user.questions.find(params[:question_id])
  33 +
  34 + sort_by = "score"
  35 + sort_order = "DESC"
  36 +
  37 + if !params[:order].blank?
17 38  
18   - find_options = {:conditions => {:question_id => @question.id},
19   - :order => order
20   - }
  39 + if params[:order][:sort_order].downcase == "asc" or params[:order][:sort_order].downcase == "desc"
  40 + sort_order = params[:order][:sort_order].downcase
  41 + end
21 42  
22   - conditions << ["question_id = ?", @question.id]
23   - conditions << ['active = ?', true] unless params[:include_inactive]
24   - find_options[:conditions] = [conditions.map{|c| c[0] }.join(" AND "), *conditions.map{|c| c[1..-1] }.flatten]
  43 + case params[:order][:sort_by].downcase
  44 + when "name"
  45 + sort_by = "choices.data"
  46 + when "date"
  47 + sort_by = "choices.created_at"
  48 + when "author"
  49 + sort_by = "visitors.identifier"
  50 + else
  51 + sort_by = "score"
  52 + end
25 53  
26   - find_options.merge!(:limit => params[:limit].to_i) if params[:limit]
27   - find_options.merge!(:offset => params[:offset]) if params[:offset]
  54 + end
28 55  
29   - @choices = Choice.find(:all, find_options)
  56 + order = "#{sort_by} #{sort_order}"
  57 +
  58 + find_options = { :include => [:creator] }
  59 + find_options.merge!({ :order => order })
  60 +
  61 + if (!params[:reproved].blank?)
  62 + @choices = @question.choices(true).reproved.find(:all, find_options)
  63 + else
  64 + if params[:inactive_ignore_flagged]
  65 + @choices = @question.choices(true).inactive_ignore_flagged.find(:all, find_options)
  66 + elsif params[:inactive]
  67 + @choices = @question.choices(true).inactive.find(:all, find_options)
  68 + else
  69 + unless params[:include_inactive]
  70 + @choices = @question.choices(true).active.find(:all, find_options)
  71 + else
  72 + @choices = @question.choices.find(:all, find_options)
  73 + end
  74 + end
  75 + end
  76 +
  77 + end
30 78  
31 79 index! do |format|
32   - format.xml { render :xml => @choices.to_xml(:only => [ :data, :score, :id, :active, :created_at, :wins, :losses], :methods => :user_created)}
  80 + format.xml { render :xml => @choices.to_xml(:only => [ :data, :score, :id, :active, :created_at, :wins, :losses], :methods => [:user_created, :creator_identifier])}
33 81 end
34 82  
35 83 end
36   -
  84 +
37 85 def votes
38 86 @choice = Choice.find(params[:id])
39 87 render :xml => @choice.votes.to_xml
40 88 end
41 89  
42 90 def create
43   -
  91 +
44 92 visitor_identifier = params[:choice].delete(:visitor_identifier)
45 93  
46   - visitor = current_user.default_visitor
  94 + visitor = current_user.default_visitor
47 95 if visitor_identifier
48 96 visitor = current_user.visitors.find_or_create_by_identifier(visitor_identifier)
49 97 end
... ... @@ -56,7 +104,7 @@ class ChoicesController &lt; InheritedResources::Base
56 104 @choice = Choice.new(params[:choice])
57 105 create!
58 106 end
59   -
  107 +
60 108 def flag
61 109 @question = current_user.questions.find(params[:question_id])
62 110 @choice = @question.choices.find(params[:id])
... ... @@ -65,7 +113,7 @@ class ChoicesController &lt; InheritedResources::Base
65 113  
66 114 if explanation = params[:explanation]
67 115 flag_params.merge!({:explanation => explanation})
68   -
  116 +
69 117 end
70 118 if visitor_identifier = params[:visitor_identifier]
71 119 visitor = current_user.visitors.find_or_create_by_identifier(visitor_identifier)
... ... @@ -110,4 +158,4 @@ class ChoicesController &lt; InheritedResources::Base
110 158  
111 159  
112 160 end
113   -
  161 +
... ...
app/models/choice.rb
... ... @@ -22,6 +22,8 @@ class Choice &lt; ActiveRecord::Base
22 22 has_many :skips_on_the_right, :through => :prompts_on_the_right, :source => :skips
23 23 named_scope :active, :conditions => { :active => true }
24 24 named_scope :inactive, :conditions => { :active => false}
  25 + named_scope :inactive_ignore_flagged, :include => :flags, :conditions => {:active => false, :flags => {:id => nil}}
  26 + named_scope :reproved, :joins => :flags
25 27 named_scope :not_created_by, lambda { |creator_id|
26 28 { :conditions => ["creator_id <> ?", creator_id] }
27 29 }
... ... @@ -82,6 +84,10 @@ class Choice &lt; ActiveRecord::Base
82 84 self.creator_id != self.question.creator_id
83 85 end
84 86  
  87 + def creator_identifier
  88 + self.creator.identifier
  89 + end
  90 +
85 91 def compute_bt_score(btprobs = nil)
86 92 if btprobs.nil?
87 93 btprobs = self.question.bradley_terry_probs
... ...