Commit a2a4ad1

mo khan <mo@mokhan.ca>
2016-06-28 19:39:53
extract sets.successful scope.
1 parent e67c7c8
Changed files (3)
app/models/exercise_set.rb
@@ -2,4 +2,5 @@ class ExerciseSet < ActiveRecord::Base
   belongs_to :exercise
   belongs_to :workout
   scope :for, ->(exercise) { where(exercise: exercise).order(:created_at) }
+  scope :successful, -> { where('actual_repetitions = target_repetitions') }
 end
app/models/training_history.rb
@@ -8,7 +8,7 @@ class TrainingHistory
   end
 
   def personal_record
-    successful_sets.maximum(:target_weight)
+    sets.successful.maximum(:target_weight)
   end
 
   def completed_any?
@@ -22,14 +22,14 @@ class TrainingHistory
   end
 
   def last_weight
-    last_successful_set = successful_sets.order('workouts.occurred_at').last
+    last_successful_set = sets.successful.last
     last_successful_set.try(:target_weight).to_i
   end
 
   def to_line_chart
     user.workouts.inject({}) do |memo, workout|
       memo[workout.occurred_at] =
-        workout.sets.where(exercise: exercise).maximum(:target_weight)
+        workout.sets.for(exercise).maximum(:target_weight)
       memo
     end
   end
@@ -37,10 +37,6 @@ class TrainingHistory
   private
 
   def sets
-    user.sets.where(exercise: exercise)
-  end
-
-  def successful_sets
-    sets.where('actual_repetitions = target_repetitions')
+    user.sets.for(exercise)
   end
 end
spec/models/program_spec.rb
@@ -44,6 +44,14 @@ describe Program do
         sets = subject.prepare_sets_for(user, squat)
         expect(sets.map(&:target_weight).uniq).to match_array([50.lbs])
       end
+
+      it 'returns the same weight after a failed workout' do
+        workout = create(:workout, user: user, routine: routine_a)
+        5.times { |n| workout.train(squat, 45, repetitions: n) }
+
+        sets = subject.prepare_sets_for(user, squat)
+        expect(sets.map(&:target_weight).uniq).to match_array([45.lbs])
+      end
     end
   end
 end