Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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
Ruby on rails 3 如何使ActiveRecord查询忽略nil条件?_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails 3 如何使ActiveRecord查询忽略nil条件?

Ruby on rails 3 如何使ActiveRecord查询忽略nil条件?,ruby-on-rails-3,activerecord,Ruby On Rails 3,Activerecord,为了避免构造复杂的动态SQL查询,我希望能够在条件中传入nil值,并忽略这些值。ActiveRecord支持吗 这里有一个例子 event = Event.find(:all, :conditions => { :title => params[:title], :start_time => pa

为了避免构造复杂的动态SQL查询,我希望能够在条件中传入nil值,并忽略这些值。ActiveRecord支持吗

这里有一个例子

event = Event.find(:all, :conditions => { 
                                          :title       => params[:title],
                                          :start_time  => params[:start_time], 
                                          :end_time    => params[:end_time]
                                        }).first
在这种特殊情况下,如果params[:start_time]设置为nil,ActiveRecord将搜索其start_time设置为null的事件。相反,我希望它忽略开始时间。如何做到这一点?

您不必“创建复杂的动态SQL查询”来完成所需的工作。只需单独构造条件散列,并在创建散列时或创建散列后排除空值

conditions = {}
conditions[:title] = params[:title] unless params[:title].blank?
conditions[:start_time] = params[:start_time] unless params[:start_time].blank?
conditions[:end_time] = params[:end_time] unless params[:end_time].blank?

但最后一种形式只有在键实际上是符号时才有效。在Rails中,params散列是一个hashWithInferenceTaccess,它允许您以符号的形式访问文本键。当然,如果需要,您可以使用键数组中的文本值来包含

然后使用预构建的条件哈希进行查询:

event = Event.find(:all, :conditions => conditions).first
conditions = params.reject {|k,v| !([:title, :start_time, :end_time]).include?(k) }
event = Event.find(:all, :conditions => conditions).first