0

ユーザーがワークアウトを完了したら、ユーザー テーブルのユーザーの運動 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 に移動しました

4

1 に答える 1