2012-04-19 105 views
2

为了避免构建复杂的动态SQL查询,我希望能够在我的条件下传递nil值,并忽略这些值。 ActiveRecord是否支持?如何获得ActiveRecord查询以忽略无条件?

这里是一个例子。

event = Event.find(:all, :conditions => { 
              :title  => params[:title], 
              :start_time => params[:start_time], 
              :end_time => params[:end_time] 
             }).first 

在这种特殊情况下,如果PARAMS [:START_TIME]设为零,ActiveRecord的将搜索那些有自己的start_time设置为null事件。相反,我希望它忽略start_time。我怎么做?

回答

6

您不必“创建复杂的动态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? 

conditions = {:title => params[:title], :start_time => params[:start_time], :end_time => params[:end_time]} 
conditions.delete_if {|k,v| v.blank? } 

conditions = params.reject {|k,v| !([:title, :start_time, :end_time]).include?(k) } 

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

,然后查询您的预建条件的哈希:

event = Event.find(:all, :conditions => conditions).first