2012-02-01 04:09:00 +00:00
|
|
|
class Habit < ActiveRecord::Base
|
2012-02-01 14:50:26 +00:00
|
|
|
ALWAYS = 1
|
|
|
|
|
DAILY = 2
|
|
|
|
|
ONE_TIME = 3
|
|
|
|
|
|
|
|
|
|
belongs_to :user
|
2012-02-01 16:37:29 +00:00
|
|
|
default_scope :order => 'position ASC'
|
2012-02-01 21:57:35 +00:00
|
|
|
acts_as_list
|
2012-02-01 16:37:29 +00:00
|
|
|
|
2012-02-01 15:28:34 +00:00
|
|
|
# TODO set cron for this
|
|
|
|
|
def self.clear_done
|
|
|
|
|
Habit.where(:habit_type => Habit::DAILY).collect do |h|
|
2012-02-06 14:45:27 +00:00
|
|
|
h.vote('down', true) unless h.done
|
2012-02-01 15:28:34 +00:00
|
|
|
h.done = false
|
|
|
|
|
h.save
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2012-02-06 14:45:27 +00:00
|
|
|
def vote(direction, clear=false)
|
2012-02-02 05:48:20 +00:00
|
|
|
# For negative values, use a line: something like y=-.1x+1
|
|
|
|
|
# For positibe values, taper off with inverse log: y=.9^x
|
|
|
|
|
# Would love to use inverse log for the whole thing, but after 13 fails it hits infinity
|
|
|
|
|
sign = ( direction=='up' ? 1 : -1 )
|
2012-02-04 19:40:45 +00:00
|
|
|
value = 0
|
2012-02-02 05:48:20 +00:00
|
|
|
if self.score < 0
|
2012-02-04 19:40:45 +00:00
|
|
|
value = ( ( -0.1 * self.score + 1 ) * sign )
|
2012-02-02 05:48:20 +00:00
|
|
|
else
|
2012-02-04 19:40:45 +00:00
|
|
|
value = ( ( 0.9 ** self.score ) * sign )
|
2012-02-02 05:48:20 +00:00
|
|
|
end
|
2012-02-04 19:40:45 +00:00
|
|
|
|
|
|
|
|
self.score += value
|
|
|
|
|
|
2012-02-04 22:34:16 +00:00
|
|
|
# also add money. Only take away money if it was a mistake (aka, a checkbox)
|
2012-02-06 14:45:27 +00:00
|
|
|
if (direction=='up') || (direction=='down' && clear==false && self.habit_type!=Habit::ALWAYS)
|
2012-02-04 19:40:45 +00:00
|
|
|
self.user.money += value
|
|
|
|
|
self.user.save
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
# up/down -voting as checkbox & assigning as done, 2 birds one stone
|
2012-02-04 21:32:12 +00:00
|
|
|
if(self.habit_type==Habit::DAILY || self.habit_type==Habit::ONE_TIME)
|
2012-02-01 15:28:34 +00:00
|
|
|
self.done = true if direction=='up'
|
|
|
|
|
self.done = false if direction=='down'
|
|
|
|
|
end
|
2012-02-04 19:40:45 +00:00
|
|
|
|
2012-02-02 05:48:20 +00:00
|
|
|
save
|
2012-02-01 14:50:26 +00:00
|
|
|
end
|
2012-02-01 04:09:00 +00:00
|
|
|
end
|