我怎样才能重构这个Rails控制器?

时间:2013-08-28 01:26:32

标签: ruby-on-rails refactoring

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

@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

这感觉非常混乱。我怎么能重构这个?

2 个答案:

答案 0 :(得分:4)

第一步:在用户和练习之间建立AR关系,可能与以下几行有关:

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

第二步:将@all_exercises移至Exercise中的类方法。

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

答案 1 :(得分:0)

从纯粹较少的代码行开始,你可以从这开始(或多或少/未经过测试但应该有效:

if @user.trainers.present?
  @my_trainer_custom_exercises = @user.trainers.each.inject([]){ |trainer, trainer_exercises| 
    trainer_exercises << trainer.exercises.all 
  }
end