現在のユーザーがフォローしている会社/スキル/学校をプロファイルに持つ他のユーザーをユーザーに表示しようとしています。プロファイルにそのような属性を持つユーザーのリストが作成されたら、返された各ユーザーに関連付けられている関連する会社/スキル/学校の数で並べ替えて、最も関連性の高いユーザーをリストの一番上に表示したいと思います。
これは機能しますが、非常に醜く、予想通り遅く、どこからクリーンアップを開始すればよいかわかりません。いくつかの指針をいただければ幸いです。
def term_helper(terms,user)
relevant_terms = []
terms.each do |term|
if user.positions.any? { |w| w.company.downcase.include?(term.downcase) rescue nil || w.industry.downcase.include?(term.downcase) rescue nil }
relevant_terms << term
end
if user.educations.any? { |w| w.school.downcase.include?(term.downcase) rescue nil }
relevant_terms << term
end
if user.held_skills.any? { |w| w.name.downcase.include?(term.downcase) rescue nil }
relevant_terms << term
end
end
relevant_terms
end
def search
if current_user
followed_companies = current_user.followed_companies.pluck(:name)
followed_skills = current_user.followed_skills.pluck(:name)
@terms = (followed_companies + followed_skills).uniq
full_list = []
full_list_with_terms = {}
users = []
@terms.each do |term|
full_list += User.text_search(term).uniq
# using pg_search gem here
end
full_list.each_with_index do |user,index|
terms = term_helper(@terms,user)
full_list_with_terms[index] = {"user" => user, "term_count" => terms.count}
end
full_list_with_terms = full_list_with_terms.sort_by {|el| el[1]["term_count"]}
full_list_with_terms.each do |el|
users << el[1]["user"]
end
@matches = users.uniq.reverse.paginate(:page => params[:page], :per_page => 10)
end
end