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

2 番目のステップ:@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
于 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 に答える