0

我的控制器中有以下内容:

@custom_exercises = @user.exercises.all
@all_exercises = Exercise.not_the_placeholder_exercise.public.order("name").all

if @user.trainers.present?
  trainer_exercises = []
  @user.trainers.each do |trainer|
    trainer_exercises << trainer.exercises.all
  end
  @my_trainer_custom_exercises = trainer_exercises
end

@exercises = @custom_exercises + @all_exercises

if @my_trainer_custom_exercises.present?
  @exercises << @my_trainer_custom_exercises
  @exercises.flatten!
end

这感觉真的很乱。我怎么能重构这个?

4

2 回答 2

4

第一步:在用户和练习之间建立一个 AR 关系,大概是这样的:

class User < ActiveRecord::Base
    has_many :trainer_exercises,
             :through => :trainers,
             :foreign_key => :client_id,
             :source => :exercises
end

第二步:移动@all_exercisesExercise.

class Exercise < ActiveRecord::Base
  def self.all_exercises
    not_the_placeholder_exercise.public.order("name").all
  end
end

这样,整个控制器就变得简单多了:

@custom_exercises = @user.exercises.all
@trainer_exercises = @user.trainer_exercises.all
@exercises = Exercise.all_exercises + @custom_exercises + @trainer_exercises
于 2013-08-28T01:37:42.203 回答
0

从纯粹更少的代码行的角度来看,您可以从这个开始(或多或少/未测试但应该可以工作:

if @user.trainers.present?
  @my_trainer_custom_exercises = @user.trainers.each.inject([]){ |trainer, trainer_exercises| 
    trainer_exercises << trainer.exercises.all 
  }
end
于 2013-08-28T01:35:48.750 回答