이 방법이 있습니다. 그것의 임무는 현재 졸업생을 졸업 한 연수생 명단을 개발자에게 반환하는 것입니다. 사용자는 개발자가 원하는 기술을 필터링합니다.어떻게 리팩토링 할 수 있습니까? 또한 서버에 대한 호출 횟수를 줄이십시오.
def filter
@skills = Skill.all
@developers = []
unless params[:ids].nil?
params[:ids].each do |skill|
skill = @skills.find(skill)
skill.trainees.each do |developer|
@developers << developer
end
end
end
if @developers.empty?
@developers = Trainee.developers.all
else
@developers = @developers.group_by {|x| x}.map {|k, v| [k, v.count]}
@developers.sort_by!(&:last).reverse!
@developers.map! do |developer|
developer[0]
end
end
respond_to do |format|
format.js {}
end
end
는 현재이 같은 방법으로 내가하고 싶은 서버 번 이상 타격 : 목록이 컨트롤러 방법 목록
상단의 관련성 개발자로 반환됩니다. 아래의 서버 로그는 11 개의 버튼을 클릭하여 필터링 한 결과로 표시됩니다. 사용자가 문제가 N+1 problem
같은 외모를 설명
Processing by SkillsController#filter as */*
Parameters: {"ids"=>["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"]}
Skill Load (0.6ms) SELECT `skills`.* FROM `skills` WHERE `skills`.`id` = 1 LIMIT 1
Trainee Load (0.6ms) SELECT `trainees`.* FROM `trainees` INNER JOIN `mastered_skills` ON `trainees`.`id` = `mastered_skills`.`trainee_id` WHERE `mastered_skills`.`skill_id` = 1
Skill Load (0.4ms) SELECT `skills`.* FROM `skills` WHERE `skills`.`id` = 2 LIMIT 1
Trainee Load (0.6ms) SELECT `trainees`.* FROM `trainees` INNER JOIN `mastered_skills` ON `trainees`.`id` = `mastered_skills`.`trainee_id` WHERE `mastered_skills`.`skill_id` = 2
Skill Load (0.3ms) SELECT `skills`.* FROM `skills` WHERE `skills`.`id` = 3 LIMIT 1
Trainee Load (1.3ms) SELECT `trainees`.* FROM `trainees` INNER JOIN `mastered_skills` ON `trainees`.`id` = `mastered_skills`.`trainee_id` WHERE `mastered_skills`.`skill_id` = 3
Skill Load (6.1ms) SELECT `skills`.* FROM `skills` WHERE `skills`.`id` = 4 LIMIT 1
Trainee Load (0.6ms) SELECT `trainees`.* FROM `trainees` INNER JOIN `mastered_skills` ON `trainees`.`id` = `mastered_skills`.`trainee_id` WHERE `mastered_skills`.`skill_id` = 4
Skill Load (0.3ms) SELECT `skills`.* FROM `skills` WHERE `skills`.`id` = 5 LIMIT 1
Trainee Load (0.9ms) SELECT `trainees`.* FROM `trainees` INNER JOIN `mastered_skills` ON `trainees`.`id` = `mastered_skills`.`trainee_id` WHERE `mastered_skills`.`skill_id` = 5
Skill Load (2.6ms) SELECT `skills`.* FROM `skills` WHERE `skills`.`id` = 6 LIMIT 1
Trainee Load (2.0ms) SELECT `trainees`.* FROM `trainees` INNER JOIN `mastered_skills` ON `trainees`.`id` = `mastered_skills`.`trainee_id` WHERE `mastered_skills`.`skill_id` = 6
Skill Load (4.2ms) SELECT `skills`.* FROM `skills` WHERE `skills`.`id` = 7 LIMIT 1
Trainee Load (0.9ms) SELECT `trainees`.* FROM `trainees` INNER JOIN `mastered_skills` ON `trainees`.`id` = `mastered_skills`.`trainee_id` WHERE `mastered_skills`.`skill_id` = 7
Skill Load (1.2ms) SELECT `skills`.* FROM `skills` WHERE `skills`.`id` = 8 LIMIT 1
Trainee Load (3.0ms) SELECT `trainees`.* FROM `trainees` INNER JOIN `mastered_skills` ON `trainees`.`id` = `mastered_skills`.`trainee_id` WHERE `mastered_skills`.`skill_id` = 8
Skill Load (0.3ms) SELECT `skills`.* FROM `skills` WHERE `skills`.`id` = 9 LIMIT 1
Trainee Load (0.8ms) SELECT `trainees`.* FROM `trainees` INNER JOIN `mastered_skills` ON `trainees`.`id` = `mastered_skills`.`trainee_id` WHERE `mastered_skills`.`skill_id` = 9
Skill Load (2.1ms) SELECT `skills`.* FROM `skills` WHERE `skills`.`id` = 10 LIMIT 1
Trainee Load (0.6ms) SELECT `trainees`.* FROM `trainees` INNER JOIN `mastered_skills` ON `trainees`.`id` = `mastered_skills`.`trainee_id` WHERE `mastered_skills`.`skill_id` = 10
Skill Load (0.3ms) SELECT `skills`.* FROM `skills` WHERE `skills`.`id` = 11 LIMIT 1
Trainee Load (0.8ms) SELECT `trainees`.* FROM `trainees` INNER JOIN `mastered_skills` ON `trainees`.`id` = `mastered_skills`.`trainee_id` WHERE `mastered_skills`.`skill_id` = 11
Rendering skills/filter.js.haml
Skill Load (0.7ms) SELECT `skills`.* FROM `skills` INNER JOIN `mastered_skills` ON `skills`.`id` = `mastered_skills`.`skill_id` WHERE `mastered_skills`.`trainee_id` = 5
Skill Load (0.5ms) SELECT `skills`.* FROM `skills` INNER JOIN `mastered_skills` ON `skills`.`id` = `mastered_skills`.`skill_id` WHERE `mastered_skills`.`trainee_id` = 2728
Skill Load (0.6ms) SELECT `skills`.* FROM `skills` INNER JOIN `mastered_skills` ON `skills`.`id` = `mastered_skills`.`skill_id` WHERE `mastered_skills`.`trainee_id` = 10
'@developers.group_by {| x | x} .map {| k, v | [k, v.count]}'여기 무엇을 기준으로 그룹화합니까? – ashvin
@ashvin by v.count. 나는 대부분의 기준에 먼저 부합하는 나의 견해 훈련생을 표시하고있다. like ... relevance – ORYON100
'@ developers' 변수의 열을 기준으로 한 그룹을 의미합니까? v.count는 레코드별로 해당 그룹을 couting한다는 의미입니다. 개발자가로드 될 때 – ashvin