有关在rails中查询的连接的例外情况

时间:2014-04-02 18:29:29

标签: ruby-on-rails activerecord

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

我做错了什么?

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?

2 个答案:

答案 0 :(得分:1)

应该是

jobs = Job.joins(:job_functions)

作业将是ActiveRecord :: Relation对象,您可以通过jobs.class检查

以下将返回一个数组。

jobs = Job.joins(:job_functions).all 


其次,不需要在最后一行再添加联接
第三,使用'当有多个值时,运算符应该在括号中。
这是更新的代码

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

答案 1 :(得分:0)

通过清理我的传入阵列来解决它,包括空白。

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_field与一个集合多次用于不同的子区域,这创建了额外的空数组条目。上面的代码清除了空的代码。

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