1

現在のユーザーがフォローしている会社/スキル/学校をプロファイルに持つ他のユーザーをユーザーに表示しようとしています。プロファイルにそのような属性を持つユーザーのリストが作成されたら、返された各ユーザーに関連付けられている関連する会社/スキル/学校の数で並べ替えて、最も関連性の高いユーザーをリストの一番上に表示したいと思います。

これは機能しますが、非常に醜く、予想通り遅く、どこからクリーンアップを開始すればよいかわかりません。いくつかの指針をいただければ幸いです。

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
4

1 に答える 1

0

いくつかのポインタ:

  1. メソッドは何をしUser.text_searchますか?全文検索エンジンを使用していますか? その場合は、term1 OR term2 OR term3用語ごとに個別の検索を開始するのではなく、1 つの検索クエリ (など) を作成する必要があります。

  2. このUser.text_searchメソッドでは、データベース結合を作成して、教育、役職、hold_skills とその会社、学校、およびスキル名をプリフェッチしていますか? これにより、データベース クエリの数が大幅に削減されます。

  3. データベース スキーマの非正規化を検討してください。company_nameテーブルに列を追加したり、positionsテーブルにschool_name列を追加したりeducations、テーブルに列を追加したりできskill_nameますheld_skills。これにより、クエリが大幅に簡素化され、パフォーマンスが向上します。

これらはいくつかの出発点になります。

于 2013-10-30T18:06:46.957 に答える