我正在尝试运行一个结合了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?
答案 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) %>