Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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 在find中组合条件。(轨道)_Sql_Ruby On Rails_Forms - Fatal编程技术网

Sql 在find中组合条件。(轨道)

Sql 在find中组合条件。(轨道),sql,ruby-on-rails,forms,Sql,Ruby On Rails,Forms,现在我从一个表单输入一些数据,我有一个代码来搜索数据库,输入几个参数作为输入条件。现在,如果其中一个参数为null(即,字段未选中),我需要用say*替换该参数,以便搜索查询不受影响。我该怎么做 @report = Problem.find(:all, :conditions => ["problems.cause_id = ? and problems.location_id = ? and problems.device_id = ? and problems.priority_id

现在我从一个表单输入一些数据,我有一个代码来搜索数据库,输入几个参数作为输入条件。现在,如果其中一个参数为null(即,字段未选中),我需要用say*替换该参数,以便搜索查询不受影响。我该怎么做

@report = Problem.find(:all, :conditions => ["problems.cause_id = ? and problems.location_id = ? and problems.device_id = ? and problems.priority_id = ?", Report.find_by_id(params[:id]).cause_id, Report.find_by_id(params[:id]).location_id, Report.find_by_id(params[:id]).device_id, Report.find_by_id(params[:id]).priority_id])

与其使用*,不如根本不具备这种条件。在本例中,它很简单,因为所有比较运算符都是“=”。这意味着您可以使用条件的散列形式。当您加载同一个报表对象3到4次时,代码的效率也很低。您关于其中一个参数为null的问题没有意义,原因是:您只是一次又一次地使用同一个参数。此外,您还将名为@report的变量设置为问题对象,这很容易混淆

@report = Report.find_by_id(params[:id])
conditions = {:cause_id => @report.cause_id, :location_id => @report.location_id, :device_id => @report.device_id, :priority_id => @report.priority_id}
conditions.delete_if{|k,v| v.blank?}
@problem = Problem.find(:all, :conditions => conditions)

哇,现在看起来好多了,但是空值问题还存在吗?i、 e如果rep.cause_id为null怎么办?按照Salil编写的方式,如果该字段为null,则该字段将替换为
'*'
。取行
cause=rep.cause\u id?rep.cause\u id:'*'
例如,如果rep.cause\u id存在,这基本上是一种条件语法,其中
cause=rep.cause\u id
,或者
cause='*'
如果rep.cause\u id不存在。事实上,他完全按照你所说的回答了这个问题,将查询替换为*if the null。我不理解代码的工作原理,所以感谢你的解释和代码。感谢这是一个非常简洁的解决方案。你以前在Railsfroms上也帮过我,所以再次感谢
@report = Report.find_by_id(params[:id])
conditions = {:cause_id => @report.cause_id, :location_id => @report.location_id, :device_id => @report.device_id, :priority_id => @report.priority_id}
conditions.delete_if{|k,v| v.blank?}
@problem = Problem.find(:all, :conditions => conditions)