Commit 9fe2d26
Changed files (14)
app
controllers
views
training_sessions
spec
controllers
models
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