Ruby on rails rails中join where查询的异常

Ruby on rails rails中join where查询的异常,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在尝试运行一个查询,该查询组合了jobs和job_functions表,然后返回结果。更困难的是搜索[:job_functions]是一个数组,因此应该检查多个job函数。我尝试了不同的方法,认为代码中仍然存在两个错误(至少) 我做错了什么 jobs = Job.joins(:job_functions).all if search.present? jobs = jobs.near(search[:locations], ((search[:distance_max].to_i ||

我正在尝试运行一个查询,该查询组合了jobs和job_functions表,然后返回结果。更困难的是搜索[:job_functions]是一个数组,因此应该检查多个job函数。我尝试了不同的方法,认为代码中仍然存在两个错误(至少)

我做错了什么

jobs = Job.joins(:job_functions).all
if search.present?
  jobs = jobs.near(search[:locations], ((search[:distance_max].to_i || 20)/1.609).to_i) if search[:locations].present?
  jobs = jobs.where("title ILIKE ?", "%" + search[:keywords] + "%") if search[:keywords].present?

  jobs = jobs.joins(:job_functions).where("job_functions.job_function = ?", search(:job_functions)) if search[:job_functions].present?
应该是

jobs = Job.joins(:job_functions)
作业将是ActiveRecord::Relation对象,您可以通过jobs.class检查它

下面将返回一个数组

jobs = Job.joins(:job_functions).all 

其次,无需在最后一行再次添加联接
第三,当有多个值并且应该在括号中时,使用“in”运算符。
下面是更新后的代码

jobs = Job.joins(:job_functions)
if search.present?
  jobs = jobs.near(search[:locations], ((search[:distance_max].to_i || 20)/1.609).to_i) if search[:locations].present?
  jobs = jobs.where("title LIKE ?", "%" + search[:keywords] + "%") if search[:keywords].present?
  jobs = jobs.where("job_functions.job_function in (?) ", search(:job_functions)) if search[:job_functions].present?
end

通过清理传入阵列(包括空格)解决了此问题

jobs = Job.joins(:job_functions)
if search.present?
  jobs = jobs.near(search[:locations], ((search[:distance_max].to_i || 20)/1.609).to_i) if search[:locations].present?
  jobs = jobs.where("title LIKE ?", "%" + search[:keywords] + "%") if search[:keywords].present?
  functions = search[:job_functions].reject! { |c| c.empty? }
  jobs = jobs.where("job_functions.job_function in (?) ", functions) if search[:job_functions].present?
end
我对不同的子区域多次使用带有集合的form_input_字段,从而创建了额外的空数组条目。上面的代码将清除空的

<%= form.input_field :job_functions, collection: t('dry.job_functions.engineering').invert.sort, as: :check_boxes, checked: params.try(:[], :search).try(:[], :area) %>


首先,这个:搜索(:job_函数)可能需要是搜索[:job_函数]。第二(我喜欢)。第三个“%#{search[:keywords]}%”。第四,其中(“job_functions.job_function IN(?),也许我遗漏了一些更重要的东西嗨,谢谢,第一点是对的。第二点我以前喜欢不区分大小写,把第三点改成了你的风格,现在似乎更常见了。在实施这些更改后,我仍然面临的问题是连接需要花费很长时间,而且我在符号转换方面会出错。但是汉克斯!谢谢你-我清理了我的代码并遵循了你的思考过程,这使我最终解决了整个问题。问题是由于我的数组中的空结果,我用一个块删除了它。