Commit 9fe2d26

mo khan <mo@mokhan.ca>
2016-06-11 16:36:22
add target sets and reps to exercise session.
1 parent cb9987e
app/controllers/training_sessions_controller.rb
@@ -13,16 +13,30 @@ class TrainingSessionsController < ApplicationController
   def new
     @workout = current_user.next_workout
     @training_session = current_user.training_sessions.build(workout: @workout)
+    @workout.exercise_workouts.each do |exercise|
+      @training_session.exercise_sessions.build(
+        exercise_workout: exercise,
+        target_sets: exercise.sets,
+        target_repetitions: exercise.repetitions,
+        target_weight: current_user.next_weight_for(exercise.exercise)
+      )
+    end
   end
 
   def create
-    secure_params = params.require(:training_session).permit(:workout_id, :body_weight)
+    secure_params = params.require(:training_session).permit(:workout_id, :body_weight, exercise_sessions_attributes: [
+      :exercise_workout_id,
+      :target_repetitions,
+      :target_sets,
+      :target_weight,
+    ])
     workout = Workout.find(secure_params[:workout_id])
     training_session = current_user.begin_workout(
       workout,
       DateTime.now,
       secure_params[:body_weight]
     )
+    training_session.update!(secure_params)
     redirect_to edit_training_session_path(training_session)
   end
 
app/models/training_history.rb
@@ -22,14 +22,18 @@ class TrainingHistory
       any?
   end
 
-  def next_weight
+  def last_weight
     user.
       exercise_sessions.
       joins(:exercise).
       joins(:training_session).
       where(exercises: { id: exercise.id }).
       order('training_sessions.occurred_at').
-      last.target_weight + 5
+      last.try(:target_weight).to_i
+  end
+
+  def next_weight
+    5 + last_weight
   end
 
   def to_line_chart
app/models/training_session.rb
@@ -4,19 +4,22 @@ class TrainingSession < ActiveRecord::Base
   has_one :program, through: :workout
   has_many :exercise_sessions, dependent: :destroy
   has_many :exercises, through: :exercise_sessions
+  accepts_nested_attributes_for :exercise_sessions
 
   def train(exercise, target_weight, completed_sets)
     recommendation = workout.exercise_workouts.find_by(exercise: exercise)
 
     session = exercise_sessions.find_by(exercise_workout: recommendation)
     if session.present?
-      session.update!(sets: completed_sets, target_weight: target_weight)
+      session.update!(actual_sets: completed_sets, target_weight: target_weight)
       session
     else
       exercise_sessions.create!(
+        actual_sets: completed_sets,
         exercise_workout: recommendation,
-        sets: completed_sets,
-        target_weight: target_weight
+        target_repetitions: recommendation.repetitions,
+        target_sets: recommendation.sets,
+        target_weight: target_weight,
       )
     end
   end
app/views/training_sessions/_training_session.html.erb
@@ -9,4 +9,5 @@
     <strong><%= exercise_session.exercise.name %></strong> @ <%= exercise_session.target_weight %> lbs,
   <% end %>
   </td>
+  <td> <%= link_to "edit", edit_training_session_path(training_session) %> </td>
 </tr>
app/views/training_sessions/index.html.erb
@@ -11,6 +11,7 @@
           <td>Date</td>
           <td>Weight</td>
           <td></td>
+          <td></td>
           </tr>
         </thead>
         <tbody>
app/views/training_sessions/new.html.erb
@@ -1,19 +1,3 @@
-<% @workout.exercise_workouts.each do |exercise| %>
-  <div class="row">
-    <div class="panel small-12 columns">
-      <div class="row">
-        <div class="small-6 columns">
-          <%= exercise.name %>
-        </div>
-        <div class="small-6 columns">
-          <%= exercise.sets %>x<%= exercise.repetitions %>
-          <%= current_user.next_weight_for(exercise.exercise) %>lb
-        </div>
-      </div>
-    </div>
-  </div>
-<% end %>
-
 <div class="row">
   <div class="small-12 columns">
     <%= form_for @training_session do |f| %>
@@ -21,6 +5,20 @@
         <legend><%= TrainingSession.human_attribute_name(:body_weight) %></legend>
         <%= f.number_field :body_weight %>
       </fieldset>
+        <%= f.fields_for :exercise_sessions do |e| %>
+          <fieldset>
+            <legend><%= e.object.exercise.name %></legend>
+            <%= e.label :sets %>
+            <%= e.number_field :sets %>
+
+            <%= e.label :repetitions %>
+            <%= number_field_tag :repetitions, e.object.exercise_workout.repetitions, disabled: true %>
+
+            <%= e.label :target_weight %>
+            <%= e.number_field :target_weight %>
+            <%= e.hidden_field :exercise_workout_id %>
+          </fieldset>
+      <% end %>
       <%= f.hidden_field :workout_id %>
       <%= f.submit "Start", class: "button round right" %>
     <% end %>
db/migrate/20160611152357_add_targets_to_exercise_sessions.rb
@@ -0,0 +1,8 @@
+class AddTargetsToExerciseSessions < ActiveRecord::Migration
+  def change
+    change_table :exercise_sessions, bulk: true do |t|
+      t.integer :target_sets, :target_repetitions, null: false, default: 5
+    end
+    rename_column :exercise_sessions, :sets, :actual_sets
+  end
+end
db/schema.rb
@@ -11,7 +11,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 20160528140323) do
+ActiveRecord::Schema.define(version: 20160611152357) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -22,8 +22,10 @@ ActiveRecord::Schema.define(version: 20160528140323) do
     t.uuid     "exercise_workout_id",              null: false
     t.datetime "created_at",                       null: false
     t.datetime "updated_at",                       null: false
-    t.text     "sets",                default: [],              array: true
+    t.text     "actual_sets",         default: [],              array: true
     t.float    "target_weight"
+    t.integer  "target_sets",         default: 5,  null: false
+    t.integer  "target_repetitions",  default: 5,  null: false
   end
 
   create_table "exercise_workouts", id: :uuid, default: "uuid_generate_v4()", force: :cascade do |t|
spec/controllers/training_sessions_controller_spec.rb
@@ -118,6 +118,31 @@ describe TrainingSessionsController do
       expect(user.training_sessions.last.body_weight).to eql(body_weight.to_f)
       expect(response).to redirect_to(edit_training_session_path(user.training_sessions.last))
     end
+
+    it 'creates the training session with the selected exercises' do
+      post :create, training_session: {
+        workout_id: workout_b.id,
+        body_weight: body_weight,
+        exercise_sessions_attributes: [
+          {
+            exercise_workout_id: workout_b.exercise_workouts.first.id,
+            target_repetitions: 4,
+            target_sets: 3,
+            target_weight: 275.0,
+          }
+        ]
+      }
+
+      expect(user.reload.training_sessions.count).to eql(1)
+      expect(user.last_workout).to eql(workout_b)
+      training_session = user.training_sessions.last
+      expect(training_session.body_weight).to eql(body_weight.to_f)
+      expect(training_session.exercise_sessions.count).to eql(1)
+      expect(training_session.exercise_sessions.first.target_sets).to eql(3)
+      expect(training_session.exercise_sessions.first.target_repetitions).to eql(4)
+      expect(training_session.exercise_sessions.first.target_weight).to eql(275.0)
+      expect(response).to redirect_to(edit_training_session_path(user.training_sessions.last))
+    end
   end
 
   describe "#edit" do
@@ -141,7 +166,7 @@ describe TrainingSessionsController do
       }
       expect(training_session.exercises).to include(squat)
       expect(training_session.progress_for(squat).target_weight).to eql(315.to_f)
-      expect(training_session.progress_for(squat).sets).to eql(['5', '5', '5'])
+      expect(training_session.progress_for(squat).actual_sets).to eql(['5', '5', '5'])
     end
   end
 end
spec/models/android/import_spec.rb
@@ -42,11 +42,11 @@ describe Android::Import do
       squat_session = training_session.progress_for(squat)
 
       expect(squat_session.target_weight).to eql(45.0)
-      expect(squat_session.sets[0]).to eql("5")
-      expect(squat_session.sets[1]).to eql("5")
-      expect(squat_session.sets[2]).to eql("5")
-      expect(squat_session.sets[3]).to eql("5")
-      expect(squat_session.sets[4]).to eql("5")
+      expect(squat_session.actual_sets[0]).to eql("5")
+      expect(squat_session.actual_sets[1]).to eql("5")
+      expect(squat_session.actual_sets[2]).to eql("5")
+      expect(squat_session.actual_sets[3]).to eql("5")
+      expect(squat_session.actual_sets[4]).to eql("5")
     end
 
     it "imports the completed bench exercise" do
@@ -55,11 +55,11 @@ describe Android::Import do
       training_session = user.training_sessions.order(:occurred_at).first
       bench_session = training_session.progress_for(bench_press)
       expect(bench_session.target_weight).to eql(65.0)
-      expect(bench_session.sets[0]).to eql("5")
-      expect(bench_session.sets[1]).to eql("5")
-      expect(bench_session.sets[2]).to eql("5")
-      expect(bench_session.sets[3]).to eql("5")
-      expect(bench_session.sets[4]).to eql("5")
+      expect(bench_session.actual_sets[0]).to eql("5")
+      expect(bench_session.actual_sets[1]).to eql("5")
+      expect(bench_session.actual_sets[2]).to eql("5")
+      expect(bench_session.actual_sets[3]).to eql("5")
+      expect(bench_session.actual_sets[4]).to eql("5")
     end
 
     it "imports the completed barbell row exercise" do
@@ -68,11 +68,11 @@ describe Android::Import do
       training_session = user.training_sessions.order(:occurred_at).first
       row_session = training_session.progress_for(barbell_row)
       expect(row_session.target_weight).to eql(65.0)
-      expect(row_session.sets[0]).to eql("5")
-      expect(row_session.sets[1]).to eql("5")
-      expect(row_session.sets[2]).to eql("5")
-      expect(row_session.sets[3]).to eql("5")
-      expect(row_session.sets[4]).to eql("5")
+      expect(row_session.actual_sets[0]).to eql("5")
+      expect(row_session.actual_sets[1]).to eql("5")
+      expect(row_session.actual_sets[2]).to eql("5")
+      expect(row_session.actual_sets[3]).to eql("5")
+      expect(row_session.actual_sets[4]).to eql("5")
     end
 
     it "excludes items that have already been imported" do
spec/models/csv/import_spec.rb
@@ -61,11 +61,11 @@ describe Csv::Import do
       squat_session = training_session.progress_for(squat)
 
       expect(squat_session.target_weight).to eql(45.0)
-      expect(squat_session.sets[0]).to eql("5")
-      expect(squat_session.sets[1]).to eql("5")
-      expect(squat_session.sets[2]).to eql("5")
-      expect(squat_session.sets[3]).to eql("5")
-      expect(squat_session.sets[4]).to eql("5")
+      expect(squat_session.actual_sets[0]).to eql("5")
+      expect(squat_session.actual_sets[1]).to eql("5")
+      expect(squat_session.actual_sets[2]).to eql("5")
+      expect(squat_session.actual_sets[3]).to eql("5")
+      expect(squat_session.actual_sets[4]).to eql("5")
     end
 
     it "imports the completed bench exercise" do
@@ -74,11 +74,11 @@ describe Csv::Import do
       training_session = user.training_sessions.order(:occurred_at).first
       bench_session = training_session.progress_for(bench_press)
       expect(bench_session.target_weight).to eql(65.0)
-      expect(bench_session.sets[0]).to eql("5")
-      expect(bench_session.sets[1]).to eql("5")
-      expect(bench_session.sets[2]).to eql("5")
-      expect(bench_session.sets[3]).to eql("5")
-      expect(bench_session.sets[4]).to eql("5")
+      expect(bench_session.actual_sets[0]).to eql("5")
+      expect(bench_session.actual_sets[1]).to eql("5")
+      expect(bench_session.actual_sets[2]).to eql("5")
+      expect(bench_session.actual_sets[3]).to eql("5")
+      expect(bench_session.actual_sets[4]).to eql("5")
     end
 
     it "imports the completed barbell row exercise" do
@@ -87,11 +87,11 @@ describe Csv::Import do
       training_session = user.training_sessions.order(:occurred_at).first
       row_session = training_session.progress_for(barbell_row)
       expect(row_session.target_weight).to eql(65.0)
-      expect(row_session.sets[0]).to eql("5")
-      expect(row_session.sets[1]).to eql("5")
-      expect(row_session.sets[2]).to eql("5")
-      expect(row_session.sets[3]).to eql("5")
-      expect(row_session.sets[4]).to eql("5")
+      expect(row_session.actual_sets[0]).to eql("5")
+      expect(row_session.actual_sets[1]).to eql("5")
+      expect(row_session.actual_sets[2]).to eql("5")
+      expect(row_session.actual_sets[3]).to eql("5")
+      expect(row_session.actual_sets[4]).to eql("5")
     end
 
     it "excludes items that have already been imported" do
@@ -110,9 +110,9 @@ describe Csv::Import do
       session = training_session.progress_for(dips)
       expect(session).to_not be_nil
       expect(session.target_weight).to eql(12.5)
-      expect(session.sets[0]).to eql("5")
-      expect(session.sets[1]).to eql("5")
-      expect(session.sets[2]).to eql("5")
+      expect(session.actual_sets[0]).to eql("5")
+      expect(session.actual_sets[1]).to eql("5")
+      expect(session.actual_sets[2]).to eql("5")
     end
 
     it "imports chinups" do
@@ -123,9 +123,9 @@ describe Csv::Import do
       session = training_session.progress_for(chinups)
       expect(session).to_not be_nil
       expect(session.target_weight).to eql(0.0)
-      expect(session.sets[0]).to eql("5")
-      expect(session.sets[1]).to eql("3")
-      expect(session.sets[2]).to eql("2")
+      expect(session.actual_sets[0]).to eql("5")
+      expect(session.actual_sets[1]).to eql("3")
+      expect(session.actual_sets[2]).to eql("2")
     end
   end
 end
spec/models/ios/import_spec.rb
@@ -50,7 +50,7 @@ describe Ios::Import do
       training_session = training_sessions.first
       first_exercises = training_session.exercise_sessions
       expect(first_exercises.count).to eql(3)
-      expect(first_exercises.first.sets).to eql(["5", "5", "5", "5", "5"])
+      expect(first_exercises.first.actual_sets).to eql(["5", "5", "5", "5", "5"])
 
       expected_date = DateTime.new(2015, 05, 02, 23, 27, 05)
       expect(training_session.occurred_at.to_i).to eql(expected_date.to_i)
@@ -69,11 +69,11 @@ describe Ios::Import do
       squat_session = training_session.progress_for(squat)
 
       expect(squat_session.target_weight).to eql(45.0)
-      expect(squat_session.sets[0]).to eql("5")
-      expect(squat_session.sets[1]).to eql("5")
-      expect(squat_session.sets[2]).to eql("5")
-      expect(squat_session.sets[3]).to eql("5")
-      expect(squat_session.sets[4]).to eql("5")
+      expect(squat_session.actual_sets[0]).to eql("5")
+      expect(squat_session.actual_sets[1]).to eql("5")
+      expect(squat_session.actual_sets[2]).to eql("5")
+      expect(squat_session.actual_sets[3]).to eql("5")
+      expect(squat_session.actual_sets[4]).to eql("5")
     end
 
     it "imports the completed bench exercise" do
@@ -82,11 +82,11 @@ describe Ios::Import do
       training_session = user.training_sessions.order(:occurred_at).first
       bench_session = training_session.progress_for(bench_press)
       expect(bench_session.target_weight).to eql(45.0)
-      expect(bench_session.sets[0]).to eql("5")
-      expect(bench_session.sets[1]).to eql("5")
-      expect(bench_session.sets[2]).to eql("5")
-      expect(bench_session.sets[3]).to eql("5")
-      expect(bench_session.sets[4]).to eql("5")
+      expect(bench_session.actual_sets[0]).to eql("5")
+      expect(bench_session.actual_sets[1]).to eql("5")
+      expect(bench_session.actual_sets[2]).to eql("5")
+      expect(bench_session.actual_sets[3]).to eql("5")
+      expect(bench_session.actual_sets[4]).to eql("5")
     end
 
     it "imports the completed barbell row exercise" do
@@ -95,11 +95,11 @@ describe Ios::Import do
       training_session = user.training_sessions.order(:occurred_at).first
       row_session = training_session.progress_for(barbell_row)
       expect(row_session.target_weight).to eql(65.0)
-      expect(row_session.sets[0]).to eql("5")
-      expect(row_session.sets[1]).to eql("5")
-      expect(row_session.sets[2]).to eql("5")
-      expect(row_session.sets[3]).to eql("5")
-      expect(row_session.sets[4]).to eql("5")
+      expect(row_session.actual_sets[0]).to eql("5")
+      expect(row_session.actual_sets[1]).to eql("5")
+      expect(row_session.actual_sets[2]).to eql("5")
+      expect(row_session.actual_sets[3]).to eql("5")
+      expect(row_session.actual_sets[4]).to eql("5")
     end
 
     it "excludes items that have already been imported" do
spec/models/training_session_spec.rb
@@ -18,7 +18,7 @@ describe TrainingSession, type: :model do
       expect(result).to be_persisted
       expect(result.target_weight).to eql(target_weight.to_f)
       expect(result.exercise).to eql(squat)
-      expect(result.sets).to eql(sets.map(&:to_s))
+      expect(result.actual_sets).to eql(sets.map(&:to_s))
     end
 
     it "updates a completed exercise" do
@@ -30,7 +30,7 @@ describe TrainingSession, type: :model do
       expect(result).to be_persisted
       expect(result.target_weight).to eql(new_weight.to_f)
       expect(result.exercise).to eql(squat)
-      expect(result.sets).to eql(new_sets.map(&:to_s))
+      expect(result.actual_sets).to eql(new_sets.map(&:to_s))
     end
 
     it "cannot save a duplicate exercise" do
@@ -53,7 +53,7 @@ describe TrainingSession, type: :model do
     it "returns the progress for the specific exercise" do
       result = subject.progress_for(exercise)
       expect(result.exercise).to eql(exercise)
-      expect(result.sets).to eql(["5", "5"])
+      expect(result.actual_sets).to eql(["5", "5"])
       expect(result.target_weight).to eql(100.0)
     end
   end
spec/models/user_spec.rb
@@ -122,7 +122,7 @@ describe User do
         training_session.exercise_sessions.create!(
           target_weight: (200 + n),
           exercise_workout: exercise_workout,
-          sets: [5, 5, 5, 5, 5]
+          actual_sets: [5, 5, 5, 5, 5]
         )
       end
     end