通过rails查询带有多个下拉菜单的单个下拉菜单

时间:2011-07-31 03:08:22

标签: sql ruby-on-rails ruby params

我在解决以下问题时遇到了一些困难。如果这篇文章有点令人困惑,我很抱歉,但我会尽力解释它。

我对rails很新,我正在尝试在我的网站上实现查询。我的网站的一部分允许用户在填写表单时从下拉菜单中选择状态。

网站的另一部分(实现查询的部分)允许用户根据与之关联的状态查询表单。该页面基本上只有4个下拉框和一个提交按钮。此查询应允许用户通过从可用的下拉菜单中选择所需的状态来查找来自多个州的表单。这意味着用户可以查询来自4种不同状态的表单,并且它将返回表单上的状态与四个下拉菜单中的一个状态匹配的所有表单。

因此,用户可以从state_1(下拉列表名称)中选择“Georgia”,从state_2选择“Texas”,从state_3选择“California”,从state_4选择“Ohio”。用户提交搜索后,我想返回与用户的下拉选项匹配的所有可用表单。

目前我遇到了一些问题。这是我目前的代码:

 def self.search(params)
    form = self.scoped

    form = form.where(:state => params[:state_1]) if params[:state_1].present?
    form = form.where(:state => params[:state_2]) if params[:state_2].present?
    form = form.where(:state => params[:state_3]) if params[:state_3].present? 
    form = form.where(:state => params[:state_4]) if params[:state_4].present?

    form
  end

我遇到的问题如下:如果我只运行一个只有state_1选择的查询,那么它将返回与该状态相关的所有字段(非常好);但是,如果我尝试在多个下拉菜单上运行带有选择的查询(例如,state_1上的“Georgia”和state_2上的“Texas”),则不返回任何表单。

再次,如果这令人困惑,我真诚地道歉,我很感激你的时间。我将不胜感激任何帮助,我将竭尽所能尽快回答任何问题。非常感谢你!

1 个答案:

答案 0 :(得分:1)

如果同时设置了:state_1:state_2,那么您将会这样做:

form = form.where(:state => params[:state_1]).where(state => params[:state_2])

那就是说

state = 'TX' AND state = 'GA'

每次拨打.where时,您都会附加另一个带连词的条件(即AND)。我想你是在追求这个:

states = [:state_1, :state_2, :state_3, :state_4].map { |k| params[k] }.reject(&:blank?)
form = form.where(:state => states) if(!states.empty?)

这会变成这样的SQL:

state IN ('TX', 'GA')

这似乎就是你所追求的。 map将为指定的状态键提取param值,然后reject将过滤掉blank个值(即false,{{1空,或所有空格。)