2012-11-22 29 views
0

我有一个查询字段,查询两个不同表格中的三个不同列:位置表中的“公司”和“行业”以及教育表中的“学校”。它已成功返回满足在搜索字段中输入的所有字段的所有用户(使用select_tag)。这是从我的观点:这个查询不是有效的

<%= form_tag(search_path, :method => :get, :id => "people_search") do %> 
    <div class="row-fluid"> 
     <div class="span4"> 
     <table> 
      <tr> 
      <td> 
       <div class="search-table" style="padding-left:55px"> 
       <%= select_tag "all", options_for_select((@visible_companies + @visible_industries + @visible_schools).uniq, params[:all]), { :placeholder => "Search by companies, industries and schools...", :multiple => true, :js => "if (evt.keyCode == 13) {form.submit();}" } %> 
       </div> 
      </td> 
      <td> 
       <%= submit_tag "Add", id: "send-button", style:"width:175px;" %> 
      </td> 
      </tr> 
     </table> 
     </div> 
    <% end %> 
    </div> 

和控制器:

@visible_positions = Position.where{ is_visible.eq('true') } 
    @visible_educations = Education.where{ is_visible.eq('true') } 

    @visible_companies = @visible_positions.order("LOWER(company)").map(&:company).uniq 
    @visible_industries = @visible_positions.order("LOWER(industry)").map(&:industry).uniq 
    @visible_schools = @visible_educations.order("LOWER(school)").map(&:school).uniq 

    @c = @visible_positions.where{company.in(my{params[:all]})}.map(&:user_id) 
    @i = @visible_positions.where{industry.in(my{params[:all]})}.map(&:user_id) 
    @s = @visible_educations.where{school.in(my{params[:all]})}.map(&:user_id) 

    @C = @visible_positions.where{company.in(my{params[:all]})}.map(&:company) 
    @I = @visible_positions.where{industry.in(my{params[:all]})}.map(&:industry) 
    @S = @visible_educations.where{school.in(my{params[:all]})}.map(&:school) 

    @blacklist = []  
    @cis = @c + @i + @s 
    @experiences = ([@C,@I,@S].reject(&:empty?).reduce(:&)) 

    @cis.uniq.each do |user_id| 

     unless @C.empty? 
     @C.uniq.each do |company| 
      unless Position.find_all_by_company(company).map(&:user_id).include?(user_id) || Position.find_all_by_industry(company).map(&:user_id).include?(user_id) || Education.find_all_by_school(company).map(&:user_id).include?(user_id) 
      @blacklist << user_id 
      end 
     end 
     end 
     unless @I.empty? 
     @I.uniq.each do |industry| 
      unless Position.find_all_by_industry(industry).map(&:user_id).include?(user_id) || Position.find_all_by_company(industry).map(&:user_id).include?(user_id) || Education.find_all_by_school(industry).map(&:user_id).include?(user_id) 
      @blacklist << user_id 
      end 
     end 
     end 
     unless @S.empty? 
     @S.each do |school| 
      unless Education.find_all_by_school(school).map(&:user_id).include?(user_id) || Position.find_all_by_company(school).map(&:user_id).include?(user_id) || Position.find_all_by_industry(school).map(&:user_id).include?(user_id) 
      @blacklist << user_id 
      end 
     end 
     end 

    end 

    unless @c.empty? && @i.empty? && @s.empty? 
     @users = User.find(@cis - @blacklist) 
    end 

搜索看起来是这样的(注意单场),与样本查询包括(注意和过滤...我” M在适合所有的搜索字词[“达特茅斯学院”学校,“世界卫生组织”的公司,为行业的互联网'])数据库的唯一用户:

enter image description here

我意识到这不是一个有效的查询,并且正在考虑如何加速它,但是可以在这一点上使用一些想法。

快乐土耳其一天:)

+0

公司和行业是公司名称还是行业名称存储在文本字段中并用逗号分隔的列? – sufleR

回答

1

根据您的描述而不是在理解你的代码,我想通了,这样的事情

User.joins(:positions, :educations).where("lower(positions.company) like lower(?) and lower(positions.industry) like lower(?) and lower(educations.school) like lower(?) and positions.is_visible and educations.is_visible", "%#{company}%", "%#{industry}%", "%#{school}%") 

,或者如果只有一个公司或行业中列

User.joins(:positions, :educations).where("(lower(positions.company) = lower(?) or lower(positions.industry) = lower(?)) and lower(educations.school) = lower(?) and positions.is_visible and educations.is_visible", company,industry, school) 

但是要把许多行业,公司,学校作为参数会更复杂 并创建索引

create index positions_lower_company on positions (lower(company)); 
create index positions_lower_industry on positions (lower(industry)); 
create index educations_lower_school on educations (lower(school)); 

我希望这会有所帮助。

相关问题