我的控制器中有以下内容:
@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
这感觉非常混乱。我怎么能重构这个?
答案 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