Commit 805e054f040cc30c67360a69954fc866f406f0bd

Authored by Ábner Silva de Oliveira
1 parent 55b3c08c

fixed sql issues in postgres database

Showing 1 changed file with 32 additions and 14 deletions   Show diff stats
app/models/choice.rb
1 1 class Choice < ActiveRecord::Base
2 2 acts_as_versioned :if_changed => [:data, :creator_id, :question_id, :active]
3   -
  3 +
4 4 belongs_to :question, :counter_cache => true
5 5 belongs_to :creator, :class_name => "Visitor", :foreign_key => "creator_id"
6   -
  6 +
7 7 validates_presence_of :creator, :on => :create, :message => "can't be blank"
8 8 validates_presence_of :question, :on => :create, :message => "can't be blank"
9 9 validates_presence_of :data
10 10 #validates_length_of :item, :maximum => 140
11   -
  11 +
12 12 has_many :votes
13 13 has_many :losing_votes, :class_name => "Vote", :foreign_key => "loser_choice_id"
14 14 has_many :flags
... ... @@ -25,7 +25,7 @@ class Choice &lt; ActiveRecord::Base
25 25 named_scope :not_created_by, lambda { |creator_id|
26 26 { :conditions => ["creator_id <> ?", creator_id] }
27 27 }
28   -
  28 +
29 29 after_save :update_questions_counter
30 30 after_save :update_prompt_queue
31 31  
... ... @@ -37,7 +37,7 @@ class Choice &lt; ActiveRecord::Base
37 37 unless part_of_batch_create
38 38 self.question.update_attribute(:inactive_choices_count, self.question.choices.inactive.length)
39 39 end
40   - end
  40 + end
41 41  
42 42 # if changing a choice to active, we want to regenerate prompts
43 43 def update_prompt_queue
... ... @@ -50,7 +50,7 @@ class Choice &lt; ActiveRecord::Base
50 50 end
51 51 end
52 52 end
53   -
  53 +
54 54 def before_create
55 55 unless self.score
56 56 self.score = 50.0
... ... @@ -63,14 +63,19 @@ class Choice &lt; ActiveRecord::Base
63 63 end
64 64 return true #so active record will save
65 65 end
66   -
  66 +
67 67 def compute_score
68 68 (wins.to_f+1)/(wins+1+losses+1) * 100
69 69 end
70   -
  70 +
71 71 def compute_score!
72 72 self.score = compute_score
73   - Choice.connection.execute("UPDATE `choices` SET `score` = #{self.score}, `updated_at` = '#{Time.now.utc.to_s(:db)}' WHERE `id` = #{self.id}")
  73 + #changed to quote tables according the database type (wasn't working in postgres)
  74 + Choice.connection.execute("UPDATE #{connection.quote_table_name("choices")}
  75 + SET #{connection.quote_column_name("score")} = #{self.score},
  76 + #{connection.quote_column_name("updated_at")} = '#{Time.now.utc.to_s(:db)}'
  77 + WHERE
  78 + #{connection.quote_column_name("id")} = #{self.id}")
74 79 end
75 80  
76 81 def user_created
... ... @@ -101,15 +106,15 @@ class Choice &lt; ActiveRecord::Base
101 106 (self.active = true)
102 107 self.save!
103 108 end
104   -
  109 +
105 110 def deactivate!
106 111 (self.active = false)
107 112 self.save!
108 113 end
109   -
  114 +
110 115 protected
111 116  
112   -
  117 +
113 118 def generate_prompts
114 119 #once a choice is added, we need to generate the new prompts (possible combinations of choices)
115 120 #do this in a new process (via delayed jobs)? Maybe just for uploaded ideas
... ... @@ -123,11 +128,23 @@ class Choice &lt; ActiveRecord::Base
123 128 previous_choices.each do |r|
124 129 inserts.push("(NULL, #{self.question_id}, NULL, #{self.id}, '#{timestring}', '#{timestring}', NULL, 0, #{r.id}, NULL, NULL)")
125 130 end
126   - #add prompts with this choice on the right
  131 + #add prompts with this choice on the right
127 132 previous_choices.each do |l|
128 133 inserts.push("(NULL, #{self.question_id}, NULL, #{l.id}, '#{timestring}', '#{timestring}', NULL, 0, #{self.id}, NULL, NULL)")
129 134 end
130   - sql = "INSERT INTO `prompts` (`algorithm_id`, `question_id`, `voter_id`, `left_choice_id`, `created_at`, `updated_at`, `tracking`, `votes_count`, `right_choice_id`, `active`, `randomkey`) VALUES #{inserts.join(', ')}"
  135 + #changed to quote tables according the database type (wasn't working in postgres)
  136 + sql = "INSERT INTO #{connection.quote_table_name("prompts")}
  137 + (#{connection.quote_column_name("algorithm_id")},
  138 + #{connection.quote_column_name("question_id")},
  139 + #{connection.quote_column_name("voter_id")},
  140 + #{connection.quote_column_name("left_choice_id")},
  141 + #{connection.quote_column_name("created_at")},
  142 + #{connection.quote_column_name("updated_at")},
  143 + #{connection.quote_column_name("tracking")},
  144 + #{connection.quote_column_name("votes_count")},
  145 + #{connection.quote_column_name("right_choice_id")},
  146 + #{connection.quote_column_name("active")},
  147 + #{connection.quote_column_name("randomkey")}) VALUES #{inserts.join(', ')}"
131 148  
132 149 Question.update_counters(self.question_id, :prompts_count => 2*previous_choices.size)
133 150  
... ... @@ -142,3 +159,4 @@ class Choice &lt; ActiveRecord::Base
142 159 #}
143 160 end
144 161 end
  162 +
... ...