Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过rails查询具有多个下拉菜单的单个下拉菜单_Sql_Ruby On Rails_Ruby_Params - Fatal编程技术网

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

Sql 通过rails查询具有多个下拉菜单的单个下拉菜单,sql,ruby-on-rails,ruby,params,Sql,Ruby On Rails,Ruby,Params,我很难弄明白下面的问题。如果这篇文章有点让人困惑,我很抱歉,但我会尽力解释清楚 我对rails比较陌生,我正在尝试在我的站点上实现一个查询。我的网站的一部分允许用户在填写表单时从下拉菜单中选择状态 站点的另一部分(实现查询的部分)允许用户根据与表单关联的状态查询表单。页面基本上只有4个下拉框和一个提交按钮。此查询应允许用户通过从可用下拉菜单中选择所需状态,从多个状态中查找表单。这意味着用户可以查询来自4种不同状态的表单,并且它将返回表单上的状态与四个下拉菜单之一的状态匹配的所有表单 因此,用户可

我很难弄明白下面的问题。如果这篇文章有点让人困惑,我很抱歉,但我会尽力解释清楚

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

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

因此,用户可以从州1(下拉列表名称)选择“乔治亚州”,从州2选择“德克萨斯州”,从州3选择“加利福尼亚州”,从州4选择“俄亥俄州”。一旦用户提交了他们的搜索,我想返回所有与用户下拉选择匹配的可用表单

目前我遇到了一些问题。以下是我目前拥有的代码:

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


再次,我真诚地道歉,如果这是混淆,我很感谢你的时间。我将感谢任何帮助,我将尽我所能尽快回答任何问题。非常感谢你

如果您同时设置了
:state_1
:state_2
,那么您将执行以下操作:

form = form.where(:state => params[:state_1]).where(state => params[:state_2])
那就是说

state = 'TX' AND state = 'GA'
每次调用
。其中
,都会附加另一个带有连词的条件(即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')

这似乎就是你想要的。将提取指定状态键的
参数
值,然后将过滤掉这些值(即
、空或全部空白)。

如果同时设置了
:state_1
:state_2
,则执行以下操作:

form = form.where(:state => params[:state_1]).where(state => params[:state_2])
那就是说

state = 'TX' AND state = 'GA'
每次调用
。其中
,都会附加另一个带有连词的条件(即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')

这似乎就是你想要的。将提取指定状态键的
param
值,然后将过滤掉这些值(即
false
nil
、空或全部空白)。

是!事实上,就是这样!非常感谢你!我几乎无法抑制我的兴奋啊哈。不过我有一个问题。。。有没有办法让默认的返回所有表单?例如当你加载页面时,它将显示所有表单,然后你可以将表单缩小到下拉选择中的表单???顺便说一下。。。下拉列表上的默认值是“no selection”@slovak_100:我认为如果你在(!states.empty?)中附加一个
如果(!states.empty?
(就像我刚才在回答中所做的那样),那么如果你没有指定任何特定的状态,你应该得到所有的状态。除非我误解了你的要求。是的,最后一次添加就做到了。非常感谢你。我非常真诚地感谢你的帮助。非常感谢。对事实上,就是这样!非常感谢你!我几乎无法抑制我的兴奋啊哈。不过我有一个问题。。。有没有办法让默认的返回所有表单?例如当你加载页面时,它将显示所有表单,然后你可以将表单缩小到下拉选择中的表单???顺便说一下。。。下拉列表上的默认值是“no selection”@slovak_100:我认为如果你在(!states.empty?)中附加一个
如果(!states.empty?
(就像我刚才在回答中所做的那样),那么如果你没有指定任何特定的状态,你应该得到所有的状态。除非我误解了你的要求。是的,最后一次添加就做到了。非常感谢你。我非常真诚地感谢你的帮助。非常感谢。