我正在创建一个健身应用程序,它有一个 struct :
用户有一个程序,程序有很多锻炼,锻炼有很多练习(M:M),锻炼有很多超集,超集有很多练习(M:M).
所以我有一个算法,创建有9个锻炼的程序,每个锻炼有6-8个锻炼,对于每个锻炼,我从数据库中找到一个合适的,并保存它与锻炼相关.因此,总的来说,我创建了一个计划,9个锻炼和54-72个练习.
然而,我花了20-25秒完成整个过程.这太过分了. 我try 使用RAW、属性选项.
以下是创建一次锻炼的算法.我在这里 Select 了不同的练习选项,但这应该不会太慢这个过程.您不需要了解模型中的字段是什么.我将非常感谢任何人的帮助,谢谢!
public static async generateWorkout(body: WorkoutRequestApi, currentDay: number, workoutCounter: number) {
let existing: string[] = [];
let exercise: ExercisesModels | null;
const workoutId: string = randomUUID();
await Workout.create({
uuid: workoutId,
isFinished: false,
programId: body.progId,
type: body.programOptions.types[workoutCounter]
})
await Superset.create({uuid: workoutId})
for (let i = 0; i < body.programOptions.workouts[currentDay].length; i++) {
console.log("DAY: " + currentDay + " I: " + i)
const currentExerciseModel = body.programOptions.workouts[currentDay][i];
let unique: boolean = false;
console.log(currentExerciseModel)
if (currentExerciseModel.isSuperset) {
while (!unique) {
const firstExercise: ExercisesModels | null = await ExerciseUtil.findWorkoutExercise(currentExerciseModel, currentExerciseModel.hasPriority ? true : false)
const secondExercise: ExercisesModels | null = await ExerciseUtil.findFixedExercise(body.programOptions.workouts[currentDay][i + 1])
if (firstExercise && secondExercise) {
if (!existing.includes(firstExercise.uuid)) {
unique = true
existing.push(firstExercise.uuid)
existing.push(secondExercise.uuid)
console.log("INSERTING " + firstExercise.uuid + " and " + secondExercise.uuid)
exercise = await this.modelToExercises(firstExercise, {
reps: currentExerciseModel.reps,
sets: currentExerciseModel.sets,
order: i
}
)
console.log(exercise)
await SupersetExercise.create({
ExerciseUuid: exercise.uuid,
SupersetUuid: workoutId
})
exercise = await this.modelToExercises(secondExercise, {
reps: currentExerciseModel.reps,
sets: currentExerciseModel.sets,
order: i+1
}
)
await SupersetExercise.create({
ExerciseUuid: exercise.uuid,
SupersetUuid: workoutId
})
}
}
}
i++;
if (i >= body.programOptions.workouts[currentDay].length)
break
} else {
if (currentExerciseModel.isFixed === true) {
console.log("FIXED EXERCISE")
exercise = await ExerciseUtil.findFixedExercise(currentExerciseModel);
if (exercise) {
console.log("FOUND FIXED" + exercise.name)
exercise = await this.modelToExercises(exercise, {
reps: currentExerciseModel.reps,
sets: currentExerciseModel.sets,
order: i
}
)
try {
await WorkoutExercise.create({
WorkoutUuid: workoutId,
ExerciseUuid: exercise.uuid
});
} catch (e) {
console.log(<Error>e)
}
}
} else {
while (!unique) {
exercise = await ExerciseUtil.findWorkoutExercise(currentExerciseModel, i <= 2)
if (exercise) {
if (!existing.includes(exercise.uuid)) {
unique = true
existing.push(exercise.uuid)
exercise = await this.modelToExercises(exercise, {
reps: currentExerciseModel.reps,
sets: currentExerciseModel.sets,
order: i
})
try {
await WorkoutExercise.create({
WorkoutUuid: workoutId,
ExerciseUuid: exercise.uuid
});
} catch (e) {
console.log(<Error>e)
}
}
}
}
}
}
}