使用外键

时间:2016-07-07 05:28:02

标签: ruby ruby-on-rails-4 search activerecord

我在Employee表的索引页面中有4个搜索字段 - id, due_date, employee_full_name, company_name

此处,在search_parameters中,我正在检查是否存在搜索参数

search_parameters = 
    {:id => params[:id], :due_date => params[:due_date], 
      :employee_full_name => params[:employee_full_name]}
     .select { |key,value| value.present?}

我正在搜索Employee表的列,它工作正常

@employees_search = Employee
    .where(search_parameters, params[:id].to_i, params[:due_date],  
     params[:employee_full_name])

这里我在公司表中搜索'company_name',其中company_id作为外键。这也很好。

@company_search = Employee
    .where(company_id: Company
    .where(company_name: params[:company_name]))

但我需要结合上述2个查询,以便用户可以一起搜索所有4个字段。有点像下面的代码。

@employees_search =  Employee
    .where(search_parameters, params[:id].to_i, params[:due_date], 
     params[:employee_full_name], 
     company_id: Company
         .where(company_name: params[:company_name]))

上面的查询只给出了员工表的搜索结果,而不是组合结果。查询有什么问题?

2 个答案:

答案 0 :(得分:0)

通过提供所有字段

,使用或查询使用活动记录查询来尝试此查询
@employees_search =  Employee
            .where("id = ? or due_date = ? or employee_full_name = ? 
            or company_id in (?)", params[:id],params[:due_date],params[:employee_full_name],
            Company.where('company_name = ?',params[:company_name]).pluck(:id))

使用'= ?'语法搜索Employee表中的所有字段,当访问company_id时,可能有多个公司具有相同的名称,因此使用in (?)语法,即使它适用于单个公司。 这将为您的所有员工提供参数的价值,同时也包括属于该公司的员工。

这可以解决您的问题。

答案 1 :(得分:0)

使用@sravan回答,我到达了以下查询,这完美地运作了。

search_parameters = 
    {:id => params[:id], :due_date => params[:due_date], 
    :employee_full_name => params[:employee_full_name], 
    :company_id => Company
        .where('company_name = ?', params[:company_name])
        .pluck(:id)}
    .select { |key,value| value.present? }

@employees_search = Employee
    .where(search_parameters, params[:id].to_i, params[:due_date], 
     params[:employee_full_name],:company_id => Company
            .where('company_name = ?',params[:company])
            .pluck(:id)
          )