ユーザーがワークアウトを完了したら、ユーザー テーブルのユーザーの運動 ID を変更したいと考えています。これを行う方法がわかりません。以下は、私がこれを理解しようとした2つの方法です。
試行 1:コントローラーに if ステートメントを配置し、true の場合にユーザーの運動 ID をインクリメントします - 問題は、条件が既に true の場合にのみ if ステートメントが渡されるため、ユーザーはワークアウトが既に完了した後に追加のエクササイズを完了しようとする必要があることです完了。
例:
def create
@completed_set = CompletedSet.new(params[:completed_set])
if @totalExercisesInWorkout.included_in?(@completedExercises) == true
raise "it worked!"
end
respond_to do |format|
if @completed_set.save
format.html { redirect_to profile_path, notice: 'Successfully completed set.' }
format.json { render json: @completed_set, status: :created, location: @completed_set }
else
format.html { render action: "new" }
format.json { render json: @completed_set.errors, status: :unprocessable_entity }
end
end
end
試行 2after_save
では、モデルでコールバックを使用します。- モデルのセッション情報にアクセスできないため、これは機能しません。そのため、ユーザーが何であるか、workout_id が何であるか、ワークアウトを終了したかどうかを知ることができません。
この問題には簡単な解決策があるはずですが、私は完全に困惑しています!
ありがとう!
編集:
ワークアウトの Exercise_id の配列がユーザーの completed_set Exercise_is の配列と一致すると、ワークアウトは完了です。したがって、次のコードが true の場合:
@totalExercisesInWorkout.included_in?(@completedExercises)
.include_in? は、2 番目の配列に最初の配列のすべての値が含まれている場合に単に true を返す Array クラスの拡張です。
ユーザーがエクササイズhas_many
を「完了する」と、そのエクササイズと関連情報 (user_id、workout_id など) が completed_set テーブルに格納されます。
myapplication_controller
にはinitialize_vars
、ユーザーとそのワークアウトについて知る必要があるすべての情報を見つけるメソッドがあります。ここにあります:
def initialize_vars
@workout = Workout.find(current_user.workout_id)
@user_program = current_user.program
@user_cycle = Cycle.find(current_user.cycle_id)
@user_group = Group.find(current_user.group_id)
@exercise = @workout.exercises
@workout_exercise = @workout.workout_exercises
# Array needs to have an exercise for every set in the exercise
@exercisesInWorkout = @workout.exercises.pluck(:exercise_id)
# Array of the sets in the users current workout
@workoutSets = @workout_exercise.pluck(:sets)
# Array of exercises user has completed in current workout
@completedExercises = CompletedSet.where(:user_id => current_user.id).pluck(:exercise_id)
# Array of exercise_id's in workout times the number of sets for each exercise
@totalExercisesInWorkout = @exercisesInWorkout.zip(@workoutSets).map { |n1, n2| [n1] * n2 }.flatten
#Total number of reps a user has completed
@repsCompleted = CompletedSet.where(:user_id => current_user.id).pluck(:repetitions).sum
#Total amount of weight a user has lifted
@weightLifted = CompletedSet.where(:user_id => current_user.id).pluck(:weight).sum
end
編集2:
ここで多くのことを学びました。コードをリファクタリングしました。これが今の様子です。
Class User
def cycle
Cycle.find(cycle_id)
end
def group
Group.find(group_id)
end
def workout
Workout.find(workout_id)
end
def completed_exercise_ids_array(user)
CompletedSet.where(workout_id: workout_id, user_id: user).pluck(:exercise_id)
end
def sets_in_workout_array
workout.workout_exercises.pluck(:sets)
end
def exercises_in_workout_times_sets_array
workout.workout_exercises.pluck(:exercise_id).zip(sets_in_workout_array).map { |n1, n2| [n1] * n2 }.flatten
end
def update_workout_if_needed!
if exercises_in_workout_times_sets_array.included_in?(completed_exercise_ids_array)
self.workout.id = self.workout.next_workout_id
save!
end
end
# Methods for progress area
def total_reps_completed(user)
CompletedSet.where(user_id: user).sum(:repetitions)
end
def total_weight_lifted(user)
CompletedSet.where(user_id: user).sum(:weight)
end
そして私のapplication_controller
class ApplicationController
# Application wide instance variables go here. Just don't forget to call initialize_vars in the controllers you want to call these variables in.
def initialize_vars
@user_workout = current_user.workout
@user_cycle = current_user.cycle
@user_group = current_user.group
@exercise = @user_workout.exercises
# Array of the sets in the users current workout
@workoutSets = current_user.sets_in_workout_array
# Array of exercises user has completed in current workout
@completedExercises = current_user.completed_exercise_ids_array(current_user)
# Array of exercise_id's in workout times the number of sets for each exercise
@totalExercisesInWorkout = current_user.exercises_in_workout_times_sets_array
end
一部のロジックを profile_controller に移動しました